【问题标题】:How efficiently multiply two sequences of matrixes in Matlab without loop?在没有循环的情况下如何有效地将 Matlab 中的两个矩阵序列相乘?
【发布时间】:2017-06-14 15:53:17
【问题描述】:

我有两个矩阵组

A1, A2... Ai  N x K
B1, B2... Bi  K x M

我想得到矩阵C = [A1 * B1; A2 * B2; ... Ai * Bi]; 可以在没有循环的Matlab中完成吗? 我可以有效地使用 GPU 进行此操作吗?

【问题讨论】:

  • C=A.*B。但似乎AB 长度不一样...
  • A1, A2...Ai 是矩阵,所以任务是矩阵乘法。

标签: matlab matrix gpu


【解决方案1】:

对 GPU 使用pagefun,它使用比循环快得多的批处理操作。

【讨论】:

    【解决方案2】:

    另一种解决方案(因为您可以争辩 cellfun 也隐含地循环:使用以下事实

    [A1*B1, A2*B2, ..., Ai*Bi] = [A1, A2, ..., Ai] * blkdiag(B1, B2, ..., Bi)

    (或者,blkdiag(A1,...,Ai)*[B1,...,Bi])。

    如果marices(i)的个数是固定的,可以直接这样写。如果没有并且你有它们,比如在一个 3-D 矩阵中,Ai = A(:,:,i)Bi = B(:,:,i) 使得 AN x K x iBK x M x i然后你可以这样做

    A = reshape(A,N,K*i);
    B = mat2cell(B,K,M*ones(1,i));
    B{1} = sparse(B{1}); % make one sparse to trigger blkdiag into sparse mode
    C = A*blkdiag(B{:});
    

    【讨论】:

    • blkdiag 似乎对此有用的功能,但它是否会占用大i 的内存作为平方时间或[A1, A2, ..., Ai] * blkdiag(B1, B2, ..., Bi) 之类的操作在matlab 中进行了优化?
    • 如果我的矩阵A 的大小为(N * i) x KB 的大小为K x (M * i),我可以避免循环吗?
    • 矩阵blkdiag(B1,B2,...,Bi)K*i x M*i 所以你会认为它会吃掉很多内存。这就是我在定义中使用sparse 的原因,这样所有的零都不会占用任何内存,并且乘法仍然有效。稀疏会带来一些开销,但它不应该比两倍差。试一试,看看它对你有什么作用。
    • 我最近遇到了一个类似的问题,这是你的K=NM=1 的特例。在这种情况下,稀疏块对角线非常有效。你可以在这里看到一些基准:stackoverflow.com/questions/41898122/…
    • M ~= 1 就我而言。不幸的是,run-built-in-functions-on-a-gpu 没有 mat2cell 函数,所以 2 变体不能在 gpu 中有效使用,可以吗?
    猜你喜欢
    • 2021-10-12
    • 1970-01-01
    • 2015-06-23
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 2015-06-23
    相关资源
    最近更新 更多