我有一个随机列矩阵:
r = rand(1,300)';
我想重新订购它,而不是按1,2,3,...,300的顺序排列元素 我将有元素1,11,21,31,...,291,2,12,22,32,...,292,3,13,33,... 293,...,300。 / p>
换句话说,我想取每10个值,从1开始按顺序放置,然后每隔10个值对2进行相同的操作。我知道一种方法是:
n = 10;
r = [r(1:n:numel(r)); r(2:n:numel(r)); r(3:n:numel(r));...;r(10:n:numel(r))]; % Skipped 4-9 in this example
但很明显,这样做多次非常麻烦。有没有更高效的东西?
一个循环应该很容易,但我似乎没有正确地做到这一点(我可以看出为什么这可能不起作用,但我无法纠正它)。
(这是我试过的:)
n = 10;
for i = 1:10
a = [r(i:n:numel(r))];
end
非常感谢任何建议或帮助。
答案 0 :(得分:4)
你可以这样做:
r = reshape(reshape(r, 10, 30)', 300, 1)
修改强>
正如@LuisMendo对评论所指出的那样,使用.'
而不是'
来转置矩阵更安全,因为如果矩阵很复杂,那么可能会引入复杂的共轭。然后,这样做会更安全:
r = reshape(reshape(r, 10, 30).', 300, 1)
答案 1 :(得分:1)
试试这个 -
intv = 10; %%// Interval after which you intend to get the values consecutively
out = r(reshape(reshape(1:numel(r),intv,[])',1,[]))
答案 2 :(得分:1)
您可以将其重塑为30x10
矩阵,转置并获取平面索引:
A = 1:300;
A = reshape(A,30,10);
A = A';
A = A(:);
答案 3 :(得分:1)
发布的其他一些解决方案效率更高,但您的想法很好。它需要一个简单的修复工作:
N = numel(r);
M = N/10;
a=[];
for ii = 1:M
a= [a r(ii:10:N)];
end
希望这有帮助