2014-11-24 177 views
1

我有这样的一个变量,它是所有一行移动号码的新行:Matlab-如果条件满足

​​

我想写一个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 

但它显然是不正确的,只是挂起。

回答

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期望的结果。使用单元格数组,以便每个“行”可以具有不同数量的列。

例子:

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 
2

如果你正在寻找一个数字阵列输出,您将需要填补“空白”的东西,并与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