【问题标题】:Multiply n vectors of length p by n matrices of size pxp将 n 个长度为 p 的向量乘以 n 个大小为 pxp 的矩阵
【发布时间】:2018-09-24 18:56:33
【问题描述】:

我有 n 长度为 p 的复数向量,我想乘以 n 大小为 p-by-p 的复数矩阵。我正在寻找在 MATLAB 中执行此操作的最有效方法。如果重要的话,我想象 n 很大,p 很小。

一个使用循环的例子(我想避免)如下所示。

N = 1e4;
p = 5;
A = randn(p, N); % N vectors of length p
B = randn(p, p, N); % N matrices of size pxp

C = zeros(p, N); 
for k = 1:N
    C(:, k) = B(:, :, k) * A(:, k);
end

有人建议我可以使用张量函数有效地实现这一点,但我无法弄清楚。

【问题讨论】:

  • 查看相关问题(以及我对此的评论)here
  • 感谢 Dev-iL,这真的很有帮助。我能够使用 MTIMESX 来处理事情(在这个例子中它要快得多)。然而,一般来说,矩阵/向量会很复杂,我的理解是 MTIMESX 和 MMX 对复数的表现要差得多。您知道解决方法吗?
  • 欢迎来到本站!很好的第一个问题
  • GitHub 上有一个贡献者试图添加一些 limited support for complex matrices(但是,如果您使用的是 R2018a 或更高版本,则无法使用)。我想如果你坚持使用这些库,它会迫使你分别传递实部和虚部(例如:mmx(real_x, real_y) - mmx(imag_x, imag_y) + 1i *( mmx(real_x, imag_y) + mmx(imag_x, real_y) ))——与Luis' answer相比,这可能效率低下。

标签: matlab matrix matrix-multiplication complex-numbers tensor


【解决方案1】:

这是一种使用implicit expansion的方法:

C = permute(sum(B.*permute(A, [3 1 2]), 2), [1 3 2]);

对于旧的 Matlab 版本(R2016b 之前),您需要使用 bsxfun 重写它:

C = permute(sum(bsxfun(@times, B, permute(A, [3 1 2])), 2), [1 3 2]);

【讨论】:

    【解决方案2】:

    您可以通过多种方式实现这一目标:

    A = rand(3, 3, 1e6);
    B = rand(3, 1);
    tic, C = zeros(3, size(A, 3));
    for i = 1:size(A, 3)
      C(:,i) = A(:,:,i)*B ;
    end, toc
    tic; C = reshape(reshape(permute(A,[2,1,3]),3,[]).'*B,3,[]); toc
    tic; C = squeeze(sum(bsxfun(@times, A, reshape(B, 1, 3)), 2)); toc
    

    在我的系统中:

    Elapsed time is 2.067629 seconds.  % Loop
    Elapsed time is 0.064164 seconds.  % permute
    Elapsed time is 0.145738 seconds   % sum(times())
    

    【讨论】:

    • 谢谢,但不幸的是,这个解决方案只展示了如何将长度为 p 的 一个 向量乘以 N 个不同的矩阵。我的问题是问如果你有 N 个不同的向量怎么做。请注意,在我的解决方案中,A 为 pxN,B 为 pxpxN,而在您的解决方案中,A 为 pxpxN,但 B 仅为 px1。 (您切换了 A 和 B,但这不是问题。)
    猜你喜欢
    • 1970-01-01
    • 2014-12-24
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多