在对增加值求和时复制矢量

时间:2015-09-19 18:10:47

标签: arrays matlab matrix vector

我有这个载体:

a = [ 7 8 9 7 8 9]; 

我想获得以下矢量:

b= [ 7 8 9 7 8 9; 
     17 18 19 17 18 19; 
     27 28 29 27 28 29; 
     37 38 39 37 38 39 ...]

我正在复制矢量,然后对每一行求和10(对于n行)。我想这样做而不使用循环迭代。我该怎么做? 非常感谢。

2 个答案:

答案 0 :(得分:12)

我的第一个bsxfun解决方案。

a = [ 7 8 9 7 8 9]; 
b = 0:10:(10+10*n);
c = bsxfun(@plus,a,b.');
c =
     7     8     9     7     8     9
    17    18    19    17    18    19
    27    28    29    27    28    29
    37    38    39    37    38    39
    47    48    49    47    48    49
    57    58    59    57    58    59
    67    68    69    67    68    69
    77    78    79    77    78    79
    87    88    89    87    88    89
    97    98    99    97    98    99
   107   108   109   107   108   109

有点解释,尽管可以在thisDivakar回答中找到对bsxfun的完整而完整的介绍。

您的行数组a会逐段添加到列向量b中。因此,a的第一个元素(在这种情况下为7)会添加到列向量b=[10;20;30;...]中,并成为输出矩阵c的第一列。 a的第二个条目与相同的列向量b相加,并成为c的第二列。重复此操作会将整个矩阵c填充为numel(b) x numel(a)的大小。

这正成为编码盛会。我进行了一些基准测试,运行了n=1000一百次循环并对结果取平均值。 Windows 7,MATLAB R2012a,i5-750 CPU。实际上,for循环在时间方面甚至不是最差的:

  • bsxfun: 0.00003556 s。
  • repmat: 0.00048514 s。
  • cumsum: 0.00015726 s。
  • for : 0.00033096 s。

在同一系统上重新定时,但使用MATLAB R2015a。 for现在是最慢的,其他人彼此相对,但bsxfun占上风!

  • bsxfun: 0.00002030 s。
  • repmat: 0.00005213 s。
  • cumsum: 0.00002180 s。
  • for : 0.00019560 s。

我使用此for循环实现的地方:

base = [7 8 9 7 8 9];
A = zeros(1e3,length(base));
for n = 1:1e3;
A(n,:) = base+10*n;
end

答案 1 :(得分:5)

为了完整性,您还可以通过使用repmat命令获得所需的结果:

n = 3;
a = [7 8 9 7 8 9];
addingMatrix = repmat([0:10:10*n+1]',1,size(a,2));

b = addingMatrix + repmat(a,n+1,1);

结果:

b =

   7     8     9     7     8     9
  17    18    19    17    18    19
  27    28    29    27    28    29
  37    38    39    37    38    39