matlab - 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 函数)。我想我遗漏了一些非常明显的东西(像往常一样),因为这似乎是一个相当简单的操作(它只是一个“元素方式”的矩阵乘法)。
解决方案
我的实际矩阵的大小是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]);
推荐阅读
- android - 安全应用程序声称我的应用程序在启动时启动,并且可以在使用时安装其他应用程序
- css - 如何在不重置 CSS 中的旋转旋转的情况下停止动画(示例解释得最好)
- mpi - 如何将可执行文件链接到 HPC/集群中的计算节点?
- java - CDI 范围和生产者
- python - 从 if 语句中更改变量,因此该语句不是真正的 Python
- typescript - 在 pm2 旁边编译一些脚本
- python - 我应该如何从这个网站上抓取 href 链接?
- amazon-web-services - AWS:不能在一次更新中执行多个 GSI 创建或删除
- java - 如果 Reactor Flux 未在设定的时间内完成,则抛出异常
- python - 在 Python 中使用入口点时区分导入的包和在 CLI 中运行的包