2013-07-31 3 views
3

У меня есть данные матрицы, содержащие 0 и «правильные» данные. Я хочу создать несколько матриц (новые), чтобы отделить данные от нулей и избавиться от этих нулей.Создайте новую матрицу из существующей матрицы между нулями

Итак, вот простой пример:

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

И я хочу, чтобы в этом случае две матрицы, которые были бы:

A =1 3 6 4 
    3 6 9 5 
    4 5 6 2 



B= 2 4 1 8 
    1 4 6 5 



C = 1 7 9 1 
    3 4 5 8 

Очевидно мои файлы данные имеют тысячи точек данных, и я нужно автоматизировать это.

Любые идеи, как это сделать?

ответ

2

вот альтернативный способ, который держит # столбцов данных в результате массив ячеек:

L=bwlabel(data); 
    for n=1:max(L) 
     result{n}=reshape(data(L==n),[],size(data,2)); 
    end 


result = 
[3x4 double] [2x4 double] [2x4 double] 

result{1} 
ans = 
     1  3  6  4 
     3  6  9  5 
     4  5  6  2 
4

Шаг 1: создать индекс строк, содержащих только нули с помощью all:

index = all(data==0,2); #% data==0<-- logical matrix; the 2 means along dimension 2 

Шаг 2: создание векторов, содержащих первый и последний индексы каждого сегмента желаемых значений:

index = [1; double(index); 1]; #% convert to numeric and pad with ones 
firsts = diff(index)==-1; #% 0 (real row) - 1 (spacer row) = -1 
lasts = (diff(index)==1)-1; #% subtract 1 because of padding 

Шаг 3: Создайте массив ячеек, который содержит последовательные сегменты исходной матрицы в каждой ячейке (с использованием cell arrays, каждая ячейка может быть другого размера или даже другого типа):

#% firsts and lasts should be the same length 
#% iterate through lists of first/last indices 
for ii=1:length(firsts) 
    result{ii} = data(firsts(ii):lasts(ii), :); 
end 

объявление государственной службы Обязательного Matlab: i и j популярные индексный переменный цикл ... вы заметите, что я использовал ii вместо этого. Here's why.

Смежные вопросы