如何在Matlab中向量化以下循环?

时间:2019-04-10 09:21:31

标签: matlab vectorization

我正在使用R2019a matlab。 我有一个矩阵,要根据对2个其他向量的计算,要在某些位置填充值。 目前,我正在使用2循环进行此操作,但这并没有利用matlab的矢量化功能。

如何以矢量化方式执行以下脚本:

C = zeros(size(vecB), size(vecA));

% Calculate face-vertix connectivity of face area values:
posMat = sparse(A, repmat((1:size(A,1))',1,3), ...
                1, size(B,1), size(A,1));

for i = 1:size(B,1)
    for j = 1:size(A,1)
        if posMat(i,j) == 1
            C(i,j) = vecA(j)/vecB(i)/3;
        end
    end
end

脚本中变量的大小:

size(A)  =         5120           3
size(B)  =         2562           3
size(B)  =         2562        5120
size(posMat)  =    2562        5120
size(vecA) =       5120           1
size(vecB) =       2562           1

1 个答案:

答案 0 :(得分:3)

由于循环内的条件仅由posMat的非零元素满足,因此对效率而言,重要的是要利用矢量化实现中该矩阵为sparse的事实。

如果使用乘以sparse条件的乘法作为将失败条件的元素设置为0的方式(而不是使用zeros初始化矩阵),则仅将通过条件将被实际评估。

从R2016b开始,vecA.'./vecB/3implicitly expanded,以返回2562×5120 double array all 值的vecA(j)/vecB(i)/3的完整ij。但是(posMat == 1) .* vecA.'./vecB/3返回一个2562×5120 sparse double array,其中仅对posMat == 1的元素进行了除法。

如果sparse的{​​{1}}值可接受,则

C

就足够了。如果需要完整的存储形式,则可以将该输出简单地传递到C = (posMat == 1) .* vecA.'./vecB/3; 函数。