2

我有如下代码:

N=10;
R=[1 1 1 1 1 0 0 0 0 0;1 1 1 1 1 1 1 1 1 1];
p=[0.1,0.2,0.01];
B = zeros(N , N);
B(1:N,1:N) = eye(N);
C=[B;R];

for q=p(1:length(p))
    Rp=C;
    for i=1:N
        if(rand < p)
            Rp(i,:) = 0;
        end
    end
end

从这段代码中,我改变了p. 所以对于不同的价值p,我变得不同RpRp现在我想从每个矩阵中获取“1”的总数。这意味着可能对于 p1 我得到 Rp1=5,对于 p2,Rp=4。

例如

Rp1=[1 0 0 0 0;0 1 0 0 0;0 0 0 0 0],
Rp2=[1 0 0 0 0;0 1 0 0 0;1 0 0 0 0],
Rp3=[0 0 0 0 0;0 1 0 0 0;0 0 0 0 0],

所以总结果将是 2,3,1。

我想得到这个结果。

4

3 回答 3

2

如果矩阵仅包含0并且1您正在尝试计算非零值并且有一个调用的函数nnz

n = nnz(Rp);

正如我在评论中提到的,你应该替换

if(rand < p)

if(rand < q)

然后您可以将非零值的数量添加到向量中,例如

r = [];
for q=p(1:length(p))
    Rp=C;
    for i=1:N
        if(rand < p)
            Rp(i,:) = 0;
        end
    end
    r = [r nnz(Rp)];
end

然后r将包含您想要的结果。如其他答案和评论中所述,有很多方法可以改进您的代码。

于 2013-10-11T08:37:15.210 回答
2

假设 Rp 是您的矩阵,则只需执行以下操作之一:

如果您的矩阵仅包含零和一

sum(Rp(:))

或者,如果您的矩阵包含多个值:

sum(Rp(:)==1)

请注意,对于二维矩阵sum(Rp(:)),与sum(sum(Rp))


我认为您真正的问题是如何保存此结果,您可以通过将其分配给索引变量来做到这一点,例如:

S(count) = sum(Rp(:));

这将要求您添加一个计数变量,该变量随着循环的每一步而增加。在循环之前正确初始化变量将是一种很好的做法(并且有效):

S = zeros(length(p),1);
于 2013-10-11T08:16:20.797 回答
0

如果您需要计算任何矩阵中的 1,M您应该能够做到sum(M(:)==1)

于 2013-10-11T08:07:40.350 回答