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

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 に答える