2013-10-11 44 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將包含您所期望的結果。其他答案和評論中提到的許多方法可以改進您的代碼。