我有一个3D矩阵A
,大小假设为3x12x100
。前两个维度定义了3×12 matrices
,后一个维度只是线性索引。我想要对这100个矩阵进行一个非常简单的运算。对于所有这些矩阵,我希望它们与共轭转置相乘。通过一个非常简单的for循环,我可以创建以下内容:
data = data;
A = zeros(100, 12, 12);
for i=1:100
A(i, :, :) = data(:, :, i)'*data(:, :, i);
end
但我喜欢干净的代码,所以我并不喜欢这种循环。我做了一些搜索,有时会找到类似mtimesx
(这是2010年定制的MATLAB函数(的东西。我想我错过了一些非常明显的东西(像往常一样(,因为这似乎是一个相当简单的操作(它只是一个"元素式"矩阵乘法(。
我实际矩阵的大小是3x12x862400
。我的原始脚本大约需要10分钟或更长时间,@FangQ发布的一个变体在几秒钟内修复了它。我的新代码如下,注意它仍在构建中,我仍然需要验证它:
data = rand(3, 12, 862400) + i*rand(3, 12, 862400)
data2 = conj(permute(data, [2 1 3])); % conjugate transpose each matrix
% my data matrix contains 862400 3x12 matrices with complex numbers
Ap = permute(data2, [2 1 4 3]);
Bp = permute(data, [1 4 2 3]);
M = Ap.*Bp;
M = sum(M, 1);
M = permute(M, [2 3 4 1]);
@Cris是对的,你可以从这个MatlabCentral post 中找到一个例子
https://www.mathworks.com/matlabcentral/answers/10161-3d-matrix-multiplication#answer_413531