2012-09-28 55 views
2

我想通過忽略零元素在矩陣上運行快速Matlab算法。執行公式忽略零元素

在過去,我只是用一個非常慢的double-for-loop例如

for i = 1 : size(x,1) 
    for j = 1 : size(x,2) 
     if x(i,j) ~= 0 
      ... do something with x(i,j) 
     end 
    end 
end 

但我怎麼能對整個矩陣X矩陣運算? 例如我怎樣才能運行

x(i,j) = log(x(i,j)) if x>0 else 0 <-- pseudo code 

在Matlab上的整個矩陣沒有for循環?

最後,我想重寫線,如

result = sum(sum((V.*log(V./(W*H))) - V + W*H)); 

與忽略零。

我只需要了解這個概念。 在需要的情況下,我也可以使用NaN而不是零,但我沒有找到例如功能

nanlog() 
+1

你爲什麼要這麼做?計算可能性? – AGS

回答

3

您可以使用NaN作爲臨時和利用的事實log(NaN) = NaN,像這樣:

x(x==0) = NaN; 
y = log(x); 
y(isnan(y)) = 0; 

或者,你可以使用邏輯索引:

x(x~=0) = log(x(x~=0)); 

,或者,如果你想保留x

y = x; 
y(y~=0) = log(y(y~=0)); 

爲您提供的例子,你可以做

result = nansum(nansum((V.*log(V./(W*H))) - V + W*H)); 

假設V == 0的問題。

5

x~=0返回您的位置不等於零的指數。然後,你可以用它們來索引相應的位置,如x如下:

>> x = [1 0 2 3; 0 4 0 5] 
x = 
    1  0  2  3 
    0  4  0  5 

>> mean(x(:)) %#mean of all elements 
ans = 
    1.8750 

>> mean(x(x~=0)) %#mean of nonzero elements 
ans = 
    3 

>> x(x~=0) = x(x~=0) + 1 
x = 
    2  0  3  4 
    0  5  0  6 
+0

我不能用這個方法使用log函數 – user1141785

+6

@ user1141785,petrichor的方法有效,x(x> 0)= log(x(x> 0)); –

+0

我沒有明白爲什麼這個答案得到-1。我會很感激評論,以便我可以改進它。 – petrichor