2013-10-11 48 views
2

计数1点的数量我有一个像下面的代码:如何从整体矩阵

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,我得到了不同的Rp。现在我想从每个Rp矩阵中获得“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。

我想得到这个结果。

+0

想过'sum(Rp)'?因为你只有1个,这将是最简单的方法... – thewaywewalk

+1

'总和(Rp(:))'将工作,因为Rp是二进制的。'(:)'通过首先对矩阵进行线性化来使得它总和所有的维数 – Dan

+0

是的,我知道但是我需要将所有的1加在一起求和。例如,Rp = [1 0 0 0 0; 0 1 0 0 0; 0 0 0 0 0]然后我的Rp = 2。我不能做到这一点。我需要得到所有值的Rp值。 –

回答

0

如果你需要统计1在任何矩阵M你应该能够做到sum(M(:)==1)

+0

这将计数的'每列1's数量,而不是在整个基质 – Dan

+0

是的,我知道,但我需要总结所有的1的together.Like RP = [1 0 0 0 0 0 1 0 0 0; 0 0 0 0 0]然后我的Rp = 2我不能这样做。 –

+0

ehm ...'sum(sum(M == 1))' – Nick

2

假设Rp为你的矩阵,那么只需执行下列操作之一:

如果您的矩阵只包含零和那些

sum(Rp(:)) 

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

sum(Rp(:)==1) 

注意,对于二维矩阵sum(Rp(:))相同sum(sum(Rp))


我认为你真正的问题是如何保存这个结果,你可以通过将其分配到索引varable,例如这样做:

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

这将需要您添加一个计数变量,随循环的每个步骤增加一次。这将是很好的做法(高效的),以循环之前正确初始化的变量:

S = zeros(length(p),1); 
2

如果矩阵只包含01您要算非零值,并没有用于调用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将包含您所期望的结果。其他答案和评论中提到的许多方法可以改进您的代码。