我有这个载体:
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行)。我想这样做而不使用循环迭代。我该怎么做? 非常感谢。
答案 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
有点解释,尽管可以在this的Divakar回答中找到对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