2

我想通过忽略零元素在矩阵上运行快速的 Matlab 算法。

过去我只使用了一个非常慢的双循环,例如

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

在没有for循环的整个矩阵上的Matlab?

最后我想重写像

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

忽略零。

我只需要理解这个概念。如果需要,我也可以使用 NaN 而不是零,但我没有找到例如函数

nanlog()
4

2 回答 2

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
于 2012-09-28T19:32:12.073 回答
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是问题所在。

于 2012-09-28T20:13:20.500 回答