矩阵乘法问题 - Matlab

时间:2016-03-10 18:32:49

标签: matlab matrix vector matrix-multiplication

为了在MatLab中创建自己的协方差函数,我需要在一行上执行矩阵乘法来创建矩阵。

给定矩阵D在哪里

D = [-2.2769    0.8746
      0.6690   -0.4720
     -1.0030   -0.9188
      2.6111    0.5162]

现在每行需要制作一个矩阵。例如第一行R = [-2.2770, 0.8746]我希望矩阵M返回M = [5.1847, -1.9915; -1.9915, 0.7649]

以下是我到目前为止所写的内容。我要求一些建议来解释如何在行上使用矩阵乘法来生成矩阵?

% Find matrices using matrix multiplication
for i=1:size(D, 1)
    P1 = (D(i,:))
    P2 = transpose(P1)
    M = P1*P2
end

1 个答案:

答案 0 :(得分:3)

您正在尝试计算每行的外积,并将其自身存储为3D矩阵中的单个切片。

您的代码几乎可以使用。您正在做的是计算内部产品或每行的点积。因此,它会给你一个数字而不是矩阵。您需要更改转置操作,以便在P1而不是P2P2上完成,现在只需P1。您也在每次迭代时覆盖矩阵M。我假设您希望将这些作为单个切片存储在3D矩阵中。为此,请分配一个3D矩阵,其中每个2D切片具有相同数量的行和列,这是D中的列数,而切片总数等于{{1}中的总行数}}。然后只需索引每个切片并相应地放置结果:

D

我们得到:

M = zeros(size(D,2), size(D,2), size(D,1));
% Find matrices using matrix multiplication
for ii=1:size(D, 1)
    P = D(ii,:);
    M(:,:,ii) = P.'*P;
end

根据您的喜好,我建议您使用bsxfun来帮助您执行相同的操作,但也许可以更快地执行此操作:

>> M

M(:,:,1) =

                5.18427361               -1.99137674
               -1.99137674                0.76492516


M(:,:,2) =

                  0.447561                 -0.315768
                 -0.315768                  0.222784


M(:,:,3) =

                  1.006009                 0.9215564
                 0.9215564                0.84419344


M(:,:,4) =

                6.81784321                1.34784982
                1.34784982                0.26646244

事实上,这个解决方案与我过去提出的类似问题有关:Efficiently compute a 3D matrix of outer products - MATLAB。唯一的区别是问题想要找到的外部产品而不是行。

代码的工作方式是我们使用M = bsxfun(@times, permute(D, [2 3 1]), permute(D, [3 2 1])); D移动维度,以便我们得到两个大小为2 x 1 x 41 x 2 x 4的矩阵。通过执行bsxfun并指定times函数,您可以同时有效地计算每个切片的外部产品矩阵。