我正在使用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
答案 0 :(得分:3)
由于循环内的条件仅由posMat
的非零元素满足,因此对效率而言,重要的是要利用矢量化实现中该矩阵为sparse
的事实。
如果使用乘以sparse
条件的乘法作为将失败条件的元素设置为0
的方式(而不是使用zeros
初始化矩阵),则仅将通过条件将被实际评估。
从R2016b开始,vecA.'./vecB/3
为implicitly expanded,以返回2562×5120 double array
的 all 值的vecA(j)/vecB(i)/3
的完整i
和j
。但是(posMat == 1) .* vecA.'./vecB/3
返回一个2562×5120 sparse double array
,其中仅对posMat == 1
的元素进行了除法。
如果sparse
的{{1}}值可接受,则
C
就足够了。如果需要完整的存储形式,则可以将该输出简单地传递到C = (posMat == 1) .* vecA.'./vecB/3;
函数。