matlab矩阵循环 - 所需的输出

时间:2013-08-04 13:34:55

标签: matlab loops matrix

我需要以下简单矩阵操作的帮助。

我的输入是:

A =

    9.8627   14.6475
   65.7510   97.6500
  -48.9131  -72.6431
   65.7510   97.6500


B =

   60.3806   39.3176   39.3176   22.1663   16.1483
         0         0         0         0         0
  123.8806   80.6665   80.6665   45.4778   33.1309
         0         0         0         0         0


C =

  279.2250  275.4000  183.6000  202.7250   84.1500
         0         0         0         0         0
  518.7707  511.6642  341.1095  376.6417  156.3418
         0         0         0         0         0

然后是我的matlab代码:

x_3 = size(A);
x_4 = size(B);


  for m_1 = 1:x_3(1,2);
      for n_1 = 1:x_4(1,2);


         G = A(:,m_1)+ B(:,n_1)+C(:,n_1)

      end
  end

此代码的结果:

G =

  349.4682
   65.7510
  593.7382
   65.7510


G =

  324.5802
   65.7510
  543.4176
   65.7510


G =

  232.7803
   65.7510
  372.8629
   65.7510


G =

  234.7540
   65.7510
  373.2064
   65.7510


G =

  110.1610
   65.7510
  140.5597
   65.7510


G =

  354.2531
   97.6500
  570.0081
   97.6500


G =

  329.3651
   97.6500
  519.6875
   97.6500


G =

  237.5651
   97.6500
  349.1328
   97.6500


G =

  239.5388
   97.6500
  349.4763
   97.6500


G =

  114.9458
   97.6500
  116.8296
   97.6500

但是我想要的输出只是一个矩阵G,它具有上面显示的所有十个矩阵(作为列)。所以基本上它会是这样的:

G =  
     349.4682   324.5802    BLAH...
     65.7510    65.7510     BLAH...
     593.7382   543.3176    BLAH...
     65.7510    65.7510     BLAH...

请有人帮忙.... :(

我很感激,谢谢!

5 个答案:

答案 0 :(得分:1)

你在循环的每次迭代中都覆盖了G的值:

G = A(:,m_1)+ B(:,n_1)+C(:,n_1)

您需要将新计算的行附加到G:

的现有行
G = [G, A(:,m_1)+ B(:,n_1)+C(:,n_1)]

答案 1 :(得分:1)

以下内容应该有效(但仅适用于size(B,2)=5size(A,2) = 2):

 G = [repmat(A(:,1),1,5) repmat(A(:,2),1,5)]+ repmat(B+C,1,2);

输出

G =

  Columns 1 through 9 

  349.4683  324.5803  232.7803  234.7540  110.1610  354.2531  329.3651  237.5651  239.5388
   65.7510   65.7510   65.7510   65.7510   65.7510   97.6500   97.6500   97.6500   97.6500
  593.7382  543.4176  372.8629  373.2064  140.5596  570.0082  519.6876  349.1329  349.4764
   65.7510   65.7510   65.7510   65.7510   65.7510   97.6500   97.6500   97.6500   97.6500

  Column 10 

  114.9458
   97.6500
  116.8296
   97.6500

如果列的顺序不那么重要,可以使用简短的一般解决方案:

   nA = size(A,2);
   nB = size(B,2);
   G = repmat(A,1,nB) + repmat(B+C,1,nA);

然后列的顺序交替出现(先是A(:,1)然后是A(:,2)...):

G =

  Columns 1 through 9 

  349.4683  329.3651  232.7803  239.5388  110.1610  354.2531  324.5803  237.5651  234.7540
   65.7510   97.6500   65.7510   97.6500   65.7510   97.6500   65.7510   97.6500   65.7510
  593.7382  519.6876  372.8629  349.4764  140.5596  570.0082  543.4176  349.1329  373.2064
   65.7510   97.6500   65.7510   97.6500   65.7510   97.6500   65.7510   97.6500   65.7510

  Column 10 

  114.9458
   97.6500
  116.8296
   97.6500

鉴于答案各不相同,我把它们带到了速度测试中,在我的pokey笔记本电脑上进行了10000次迭代:

@LuisMendo经过的时间是1.906000秒。

@TryHard经过的时间是1.625000秒。 (编辑!)

@MohsenNosratinia经历的时间是3.985000秒。

答案 2 :(得分:1)

以下代码可以满足您的需求。由于您没有指定大小,我已经非常一般:A和B可以有任意数量的列。假设B和C具有相同的大小,当然A,B,C需要具有相同的行数。

D = B+C;
numA = size(A,2);
numB = size(B,2);

sol = reshape(repmat(A,numB,1),size(A,1),size(A,2)*numB) + repmat(D,1,numA)

答案 3 :(得分:1)

您可以要求kron函数为您完成所有重复

G = kron(A, ones(1,size(B,2)))+kron(ones(1,size(A,2)),B+C);

答案 4 :(得分:1)

保持与原始代码的接近(这不是非常有效,但这不是您所询问的):您只需要确保每个循环都会将您带到G中的新列:

gcol = 0;
for m_1 = 1:x_3(1,2);
  for n_1 = 1:x_4(1,2);

    gcol = gcol + 1;
    G(:, gcol) = A(:,m_1) + B(:,n_1) + C(:,n_1)

  end
end

这会将每个连续的结果放在自己的列中。

最好在开始之前分配G的大小 - 这是一个好习惯,随着矩阵大小的增加变得更加重要(它可以防止大量数据复制和#34;新尺寸的空间")。为此,您将使用

G = zeros(x_3(1), x_3(1,2) * x_4(1,2));

在嵌套循环之前。

注意 - 此配方的优点是您可以非常清楚地看到代码正在做什么。根据我的经验,10次中有9次"清晰的代码"特朗普"高效但难以遵循"码。从现在开始的六个月,您想要记住您的代码所做的事情。在速度真的很重要的情况下,我会经常放慢速但清晰的#34;注释中的代码,并执行快速但模糊的" - 使用测试用例确保他们确实产生相同的答案。看起来很麻烦,但值得花费额外的时间。有一天你会感谢我......

编辑另一种有点优雅的技巧会使用bsxfun - 如下所示:

G = reshape( bsxfun(@add, reshape(A, size(A,1),1,[]), B+C), size(A,1), []);

这是有效的,因为bsxfun将在每个维度上自动执行操作(add),其中一个数组具有单个维度,而另一个数组具有非单个维度 - 实际上执行{for 1}}循环而不需要for循环。因为没有更大的"制作数组的副本,它应该稍微快一些。当A和B,C是大数组时,这可能更明显 - 因为当前大小的大部分时间都会进入函数开销。

我没有运行时间基准测试,但通常bsxfunrepmat更快...例如参见https://stackoverflow.com/a/12955706/1967396