我有一个像这样的变量,它只是一行:
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
但它显然不对,只是挂起。
答案 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