2014-11-24 3 views
1

У меня есть переменная, как это, что это все одна строка:Matlab- перемещения номера в новую строку, если условие выполняется

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

Я хочу, чтобы написать цикл, который будет найти, где число меньше, чем предыдущий один и положить остальные цифры в новой строке, как этот

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