3

Matlabでループを使用せずに最善を尽くそうとしていますが、非常に難しい場合があります。

たとえば、私はこのコードを書きました:

vector = zeros(p,1);

diagDominantFlag = 1;
for row = 1:p
    for col = 1:q
        if(row ~= col)
            vector(row) = vector(row) + A(row,col);
        end
    end
    if(A(row,row) <= vector(row))
        diagDominantFlag = 0;
        break;
    end
end

forその二重ループをベクトル化することは可能ですか?

ありがとう

4

3 に答える 3

2

内側のループを次のように置き換えることができます

vector(row) = sum(A(row, :)) - A(row, row);

実際、すべてを次のように置き換えることができます

vector = sum(A, 2) - diag(A);

外側のループにあるチェックを追加するには、次のようにします。

f = find(diag(A) <= vector);
if length(f) > 0
    diagDominantFlag = 0;
    vector(f(1):end) = 0;
end
于 2012-05-30T17:20:38.057 に答える
2

あなたの直接の質問に対する答えではありませんが、ここに対角優位性のループレステストがあります(あなたはそれに興味があるように見えるので):

all(diag(A) >= (sum(abs(A),2)-abs(diag(A)) )

または厳密な対角優位の場合:

all(diag(A) > (sum(abs(A),2)-abs(diag(A)) )

また、上記のコードでは、必ずabs()非対角値を使用してください。

于 2012-05-30T17:22:56.993 に答える
2

アンサリの答えに加えて、は次のdiagDominantFlagように計算できます。

diagDominantFlag = all(diag(A) >= (sum(A, 2) - diag(A)));

したがって、ダブルforループをワンライナーに置き換えます。

于 2012-05-30T17:26:42.423 に答える