我正在尝试将精度矩阵sigmaT转换为协方差矩阵。我尝试了两种方法:
covMat = zeros(size(sigmaT));
for i=1:t
covMat(:, :, i) = eye(D)/sigmaT(:,:,i);
end
和
covMat = bsxfun(@rdivide, eye(D), sigmaT);
sigmaT中的一些元素为零,因此除以零。第一个基于循环的解决方案将除以0的元素保持为0,第二个方法将元素设置为NaN。
我的问题是:为什么它们的行为不同?我如何改变第二种单线方法来表现为基于循环的方法?我相信后一种解决方案在大型矩阵上应该明显更快。
答案 0 :(得分:0)
基于循环的方法正在执行矩阵除法,即每次迭代的结果是sigmaT(:,:,i)
的矩阵逆。您可以使用./
运算符(而不是/
)调整循环以执行每元素数学运算。
您基于bsxfun
的方法正在执行按元素划分,即每个元素都被反转。无法使用bsxfun
对3D数组中包含的每个2D矩阵执行矩阵运算。
这些答案非常不同。您应该使用适合您的问题的任何方法。两者之间的性能差异可能相对较小。