我正试图将精度矩阵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。
我的问题是:为什么它们的行为不同,我如何改变第二个单行方法,使其表现为基于循环的方法?我相信后一种解决方案应该在大型矩阵上明显更快。
基于循环的方法是执行矩阵除法,即每次迭代的结果是sigmaT(:,:,i)
的矩阵逆。您可以通过使用./
操作符(而不是/
)来调整循环以执行每个元素的数学运算。
您的基于bsxfun
的方法是执行每个元素的划分,即每个单独的元素是颠倒的。没有办法使用bsxfun
对3D数组中包含的每个2D矩阵执行矩阵运算。
这些答案非常不同。您应该使用适合您的问题的任何方法。两者之间的性能差异可能相对较小。