【问题标题】:How to replace this for loop with matrix operations in matlab如何用matlab中的矩阵运算替换这个for循环
【发布时间】:2014-05-01 22:07:06
【问题描述】:

我知道在 Matlab 中编写 for 循环通常效率不高。 现在我正在尝试用更好的选择替换嵌套的 for 循环。 这是嵌套循环,

for i = 1: size(A,1)
   for j = 1: size(B,1)
      S(i,j, :) = c*(A(i,:)*a - B(j,:)*b);
   end
end

我应该使用什么操作? (我在考虑笛卡尔积的实现)

【问题讨论】:

  • 输入是什么维度?
  • A为1000*500,B为300*40,a为500*5,b为40*5,c为1*1。
  • 您对问题中代码后面的尺寸有疑问...
  • 包含这段代码的函数被调用了10^6次,所以在这个过程中的任何加速,最终都会导致整个过程的加速。
  • 我提到的尺寸也可能大得多,具体取决于输入,所以我更感兴趣的是知道如何消除 for 循环,而不是如何使 for 循环适合我的尺寸。跨度>

标签: matlab for-loop


【解决方案1】:

试试下面的

AA = permute(A * a, [1, 3, 2]);
BB = permute(B * b, [3, 1, 2]);
CC = c * bsxfun(@minus, AA, BB);

【讨论】:

  • 非常感谢。你知道一个很好的参考来学习这些元素以获得更多风格的 Matlab 编码,比如 bsxfun。我不知道它们,并且以一种非常困难的方式,一个一个地找到它们。
  • 我不经常使用间接函数,因为我预计这样做会大大降低性能。我想这可能是我在旧版本 matlab 中的经验。
  • 有时 tic-toc 让我感到惊讶。这个解决方案 .00604s,我的解决方案 .01329s,@Luis Mendo 解决方案 .704s。
【解决方案2】:
nA = size(A,1);
nB = size(B,1);
Ar = repmat(A, nB, 1); %// repeat A along rows
Br = B(ceil(1/nA:1/nA:nB), :); %// stretch B along rows
S = c*(Ar*a-Br*b); %// do the computations
S = reshape(permute(S, [1 3 2]), nA, nB, []); %// put into shape

【讨论】:

  • @user25004 嗯...我只是从一本旧手册中学习了Matlab,然后大量使用它。 StackOverflow 也有帮助。当然还有 Matlab 在线文档
【解决方案3】:
    A=(1:20)'*ones(1,10);
    size(A)   % 20,10
    a=ones(10,1)*(1:5);
    size(a)    %10,5
    B=ones(3,1)*(1:20);
    size(B)    %3,20
    b=ones(20,1)*(1:5);
    size(b)    %20,5
    c=1;
    Aa=A*a;
    size(Aa)   %20,5
    Bb=B*b;
    size(Bb)    %3,5
    na=size(Aa,1);
    nb=size(Bb,1);
    Ia=(1:na)'* ones(1,nb);
    %Ia=1;2;3..nb;1;2;3..nb na times
    Ia=reshape(Ia,na*nb,1);
    %Ib=1;1;natimes;2;2;2 natimes...nb;nb;nb...natimes
    Ib=ones(na,1)*(1:nb);
    Ib=reshape(Ib,na*nb,1);
    S=(Aa(Ia,:)-Bb(Ib,:))*c;
    S=reshape(S,[na nb size(Aa,2)]);

【讨论】:

  • 谢谢 我没有这样想过。不过具体的代码似乎不起作用。
  • @user25004 测试环境是 octave 而不是 matlab,但我通常很擅长在两者之间保持一致。之前是从测试脚本手抄的,但这里是从原文剪切和粘贴的。
猜你喜欢
  • 2014-11-22
  • 2019-06-12
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
相关资源
最近更新 更多