我正在努力尽力而不是在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
循环进行矢量化?
谢谢
答案 0 :(得分: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
答案 1 :(得分:2)
不是你的直接问题的答案,但是,这是对对角优势的无环路测试(因为你似乎对此感兴趣):
all(diag(A) >= (sum(abs(A),2)-abs(diag(A)) )
或严格的对角优势:
all(diag(A) > (sum(abs(A),2)-abs(diag(A)) )
另外,在上面的代码中,请确保对非对角线值abs()
。
答案 2 :(得分:2)
添加到Ansari的答案中,diagDominantFlag
可以通过以下方式计算:
diagDominantFlag = all(diag(A) >= (sum(A, 2) - diag(A)));
因此用一行代替你的双for
循环。