Matlab:如何重新排序(重新组织)矩阵

时间:2014-04-10 16:30:09

标签: matlab loops matrix

我有一个随机列矩阵:

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

非常感谢任何建议或帮助。

4 个答案:

答案 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

希望这有帮助