我希望通过忽略零元素来在Matrices上运行快速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
在Matlab上整个矩阵没有for循环?
最后我想重写像
这样的行result = sum(sum((V.*log(V./(W*H))) - V + W*H));
忽略零。
我只需要理解这个概念。 如果需要,我也可以使用NaN而不是零,但我没有找到,例如功能
nanlog()
答案 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
答案 1 :(得分: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
是问题所在。