矩阵乘法问题 - Matlab

Matrix Multiplication Issue - Matlab

为了在 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

您正在尝试计算每一行的外积,其本身作为单独的切片存储在 3D 矩阵中。

您的代码几乎可以正常工作。您正在做的是计算 内积 或每行与自身的点积。因此它会给你一个数字而不是矩阵。您需要更改转置操作,以便它在 P1 而不是 P2 上完成,并且 P2 现在将只是 P1。此外,您还在每次迭代时覆盖矩阵 M 。我假设您想将这些作为单独的切片存储在 3D 矩阵中。为此,分配一个 3D 矩阵,其中每个 2D 切片具有相等的行数和列数,即 D 中的列数,而切片总数等于 [=18] 中的总行数=].然后只需索引每个切片并相应地放置结果:

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

我们得到:

>> 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

根据您的喜好,我建议使用 bsxfun 来帮助您执行相同的操作,但可能会更快:

M = bsxfun(@times, permute(D, [2 3 1]), permute(D, [3 2 1]));

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

代码的工作方式是我们用 Dpermute 移动维度,以便我们得到两个大小为 2 x 1 x 41 x 2 x 4 的矩阵。通过执行 bsxfun 并指定 times 函数,这使您可以同时高效地计算每个切片的外积矩阵。