【发布时间】:2014-11-10 17:42:46
【问题描述】:
假设我有一个这样的元素矩阵:
A = reshape(1:25, 5, 5)
A =
1 6 11 16 21
2 7 12 17 22
3 8 13 18 23
4 9 14 19 24
5 10 15 20 25
我想有效地计算外积的 3D 矩阵,这样输出矩阵的第 ith 切片是第 ith 列的外积A 本身。如果u 和v 都是列向量,则两个向量u 和v 之间的外积就是u*v.'。
因此,此输出矩阵B 的每个切片的结构应为:
B(:,:,1) = A(:,1) * A(:,1).';
B(:,:,2) = A(:,2) * A(:,2).';
...
...
B(:,:,5) = A(:,5) * A(:,5).';
我目前的方法如下。我尝试使用arrayfun 和cell2mat 这样做:
cellmatr = arrayfun(@(x) A(:,x) * A(:,x).', 1:size(A,2), 'uni', 0);
out = reshape(cell2mat(cellmatr), size(A,1), size(A,1), size(A,2));
我只是在1 和A 中的尽可能多的列之间循环一个线性索引数组,对于这个数组中的每个元素,我访问相应的列并计算外积。因此,输出将给出一个 1D 单元格网格,然后我将其转换回 2D 矩阵,然后重新整形为 3D 矩阵以找到外积的 3D 矩阵。
但是,对于大型矩阵,这非常慢。我还尝试在我的arrayfun 调用中用kron(即kron(A(:,x), A(:,x)))替换矩阵乘积,但这对于我的目的来说仍然很慢。
有谁知道以这种方式计算这个外部产品的 3D 矩阵的有效方法?
【问题讨论】:
-
@natan - 我没有,但感谢 FEX 的链接!
-
我想知道这与 Divakar 的回答相比效率如何......
-
@natan - 我会从 FEX 下载那个库,我会告诉你的。现在我正在寻找一个纯粹基于 MATLAB 的解决方案。
-
@natan - 我将如何使用该库来计算 3D 外积还不太清楚。你有什么建议吗?
标签: matlab matrix vectorization