矩阵乘法问题 - 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。唯一的区别是问题想要找到 列 的外积而不是行。
代码的工作方式是我们用 D
的 permute
移动维度,以便我们得到两个大小为 2 x 1 x 4
和 1 x 2 x 4
的矩阵。通过执行 bsxfun
并指定 times
函数,这使您可以同时高效地计算每个切片的外积矩阵。
为了在 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。唯一的区别是问题想要找到 列 的外积而不是行。
代码的工作方式是我们用 D
的 permute
移动维度,以便我们得到两个大小为 2 x 1 x 4
和 1 x 2 x 4
的矩阵。通过执行 bsxfun
并指定 times
函数,这使您可以同时高效地计算每个切片的外积矩阵。