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

添加到 Ansari 的答案中,diagDominantFlag可以通过以下方式计算:

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

因此用单线替换你的双for循环。

于 2012-05-30T17:26:42.423 回答