2012-09-28 54 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