Matlab-如果满足条件,则将数字移动到新行

时间:2014-11-24 21:44:20

标签: arrays matlab if-statement for-loop jagged-arrays

我有一个像这样的变量,它只是一行:

1 2 3 4 5 6 7 8 9 2 4 5 6 5

我想编写一个for循环,它会找到一个数字小于前一个数字的位置,并将其余数字放在一个新行中,如下所示

1 2 3 4 5 6 7 8 9
2 4 5 6 
5

我试过这个:

test = [1 2 3 4 5 6 7 8 9 2 4 5 6 5];
m = zeros(size(test));
for i=1:numel(test)-1;
   for rows=1:size(m,1)
     if test(i) > test(i+1);
     m(i+1, rows+1) = test(i+1:end)
   end % for rows
end % for

但它显然不对,只是挂起。

2 个答案:

答案 0 :(得分:3)

x成为您的数据向量。你想要的只是简单地完成如下:

ind = [find(diff(x)<0) numel(x)]; %// find ends of increasing subsequences
ind(2:end) = diff(ind); %// compute lengths of those subsequences
y = mat2cell(x, 1, ind); %// split data vector according to those lenghts

这会在单元格数组y中产生所需的结果。使用单元阵列使得每个&#34;行&#34;可以有不同数量的列。

示例:

x = [1 2 3 4 5 6 7 8 9 2 4 5 6 5];

给出

y{1} =
     1     2     3     4     5     6     7     8     9
y{2} =
     2     4     5     6
y{3} =
     5

答案 1 :(得分:2)

如果您正在寻找数字数组输出,则需要填补&#34;空白&#34;有一些东西,并填充zeros似乎是一个很好的选择,因为你似乎也在你的代码中做。

所以,这是基于 bsxfun 的方法来实现相同的目标 -

test = [1 2 3 4 5 6 7 8 9 2 4 5 6 5] %// Input
idx = [find(diff(test)<0) numel(test)] %// positions of row shifts
lens = [idx(1) diff(idx)] %// lengths of each row in the proposed output
m = zeros(max(lens),numel(lens)) %// setup output matrix
m(bsxfun(@le,[1:max(lens)]',lens)) = test; %//'# put values from input array
m = m.' %//'# Output that is a transposed version after putting the values

输出 -

m =
     1     2     3     4     5     6     7     8     9
     2     4     5     6     0     0     0     0     0
     5     0     0     0     0     0     0     0     0