首页 > 解决方案 > 3D矩阵,最后一维的乘法

问题描述

我有一个 3D-matrix 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

但我喜欢干净的代码,所以我不太喜欢这个 for 循环。我做了一些搜索,有时会找到类似的东西mtimesx(这是 2010 年定制的 MATLAB 函数)。我想我遗漏了一些非常明显的东西(像往常一样),因为这似乎是一个相当简单的操作(它只是一个“元素方式”的矩阵乘法)。

标签: 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]);

推荐阅读