为了在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
答案 0 :(得分:3)
您正在尝试计算每行的外积,并将其自身存储为3D矩阵中的单个切片。
您的代码几乎可以使用。您正在做的是计算内部产品或每行的点积。因此,它会给你一个数字而不是矩阵。您需要更改转置操作,以便在P1
而不是P2
和P2
上完成,现在只需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 4
和1 x 2 x 4
的矩阵。通过执行bsxfun
并指定times
函数,您可以同时有效地计算每个切片的外部产品矩阵。