Matlab 如何在没有循环的情况下将向量重新排序为矩阵?
这是我的任务 我有一个像这样的向量Matlab 如何在没有循环的情况下将向量重新排序为矩阵?,matlab,matrix,Matlab,Matrix,这是我的任务 我有一个像这样的向量 a = [1 2 3 4 5 6 7 8 9 10 11]; 我想要一个这样的矩阵: b = [1 2 3; 3 4 5; 5 6 7; 7 8 9; 9 10 11]; 也就是说,在每两个元素中,我选择三个元素。 一般来说,我希望在每k个元素中选取m个元素 我知道如何使用循环,但我想问,是否有一种方法可以在MATLAB中不使用循环。 提前感谢。要每k个元素选择m个元素: inds = bsxfun(@plus,(1
a = [1 2 3 4 5 6 7 8 9 10 11];
我想要一个这样的矩阵:
b = [1 2 3;
3 4 5;
5 6 7;
7 8 9;
9 10 11];
也就是说,在每两个元素中,我选择三个元素。
一般来说,我希望在每k个元素中选取m个元素
我知道如何使用循环,但我想问,是否有一种方法可以在MATLAB中不使用循环。
提前感谢。要每k个元素选择m个元素:
inds = bsxfun(@plus,(1:m),(0:k:(numel(a)-m)).')
a(inds)
要每k个元素拾取m个元素,请执行以下操作:
inds = bsxfun(@plus,(1:m),(0:k:(numel(a)-m)).')
a(inds)
这种模式出现在汉克尔矩阵中
ha = hankel(a');
b = ha(1:k:end-m+1, 1:m);
这种模式出现在汉克尔矩阵中
ha = hankel(a');
b = ha(1:k:end-m+1, 1:m);
我想出了类似的方法,但我不确定它是否适用于所有情况:
a(cumsum([1:m; ones(floor((numel(a) - m) / k), m) * k]))
我想出了类似的方法,但我不确定它是否适用于所有情况:
a(cumsum([1:m; ones(floor((numel(a) - m) / k), m) * k]))
另一种方法:
m = 3;
k = 2;
a = [1 2 3 4 5 6 7 8 9 10 11]; %// length should be {a multiple of k} plus m
result = reshape(a(1:floor(numel(a)/k)*k), k, []);
result = [result; result(1:m-k,2:end) a(end-m+k+1:end).'].';
另一种方法:
m = 3;
k = 2;
a = [1 2 3 4 5 6 7 8 9 10 11]; %// length should be {a multiple of k} plus m
result = reshape(a(1:floor(numel(a)/k)*k), k, []);
result = [result; result(1:m-k,2:end) a(end-m+k+1:end).'].';
我认为你的最终指数是错误的,因为你可以达到努梅拉-k+m@BenVoigt谢谢,那应该是a-m。在本例中,它没有显示错误,因为冒号不能以k步到达那里。我认为您的结束索引是错误的,因为您可以到达numela-k+m@BenVoigt谢谢,那应该是a-m。在这个例子中,它没有显示错误,因为冒号不能用k步到达那里。在这个例子中,当m=k=2时,结果应该是什么?@RafaelMonteiro我想对于这个a,它是未定义的。好问题@RafaelMonteiro问得好,这不会发生,谢谢@在这个例子中,当m=k=2时,结果应该是什么?@RafaelMonteiro我想对于这个a,它是未定义的。好问题@RafaelMonteiro好问题,这不会发生,谢谢@这是一个很好的解决方案,但要注意实际中的内存使用情况,因为ha是方形的。这是一个很好的解决方案,但要注意实际中的内存使用情况,因为ha是方形的。