我有这个向量:
a = [ 7 8 9 7 8 9];
Run Code Online (Sandbox Code Playgroud)
我想获得以下矢量:
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 ...]
Run Code Online (Sandbox Code Playgroud)
我正在复制矢量,然后对每一行求和10(对于n行).我想这样做而不使用循环迭代.我该怎么做?非常感谢.
Adr*_*aan 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
Run Code Online (Sandbox Code Playgroud)
有点解释,尽管bsxfun可以在Divakar的这个答案中找到完整而完整的介绍.
会发生什么是您的行数组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
Run Code Online (Sandbox Code Playgroud)
为了完整起见,您还可以通过使用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);
Run Code Online (Sandbox Code Playgroud)
结果:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
168 次 |
| 最近记录: |