2013-06-21 5 views
1

У меня есть матрица, которая выглядит примерно так (10 x 8), и мне нужно изменить форму на «переменную длину строки», но те же # столбцы, как показано ниже: текущая матрица:Обрезка MATLAB Array Keeping Columns

NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN 
    NaN  NaN  NaN  NaN 1.0000  NaN  NaN  NaN 
    NaN  NaN  NaN  NaN 0.9856  NaN  NaN  NaN 
    NaN  NaN  NaN 1.0000 0.9960  NaN  NaN  NaN 
    NaN 1.0000  NaN 1.2324 0.9517  NaN  NaN  NaN 
    NaN 1.0721  NaN 1.1523 0.8877  NaN  NaN 1.0000 
    NaN 1.0617 1.0000 0.9677 1.0006  NaN  NaN 1.3116 
1.0000 0.9944 0.9958 1.0712 1.0369 1.0000 1.0000 1.2027 
0.9717 0.9995 0.9705 1.0691 0.8943 0.9724 0.8863 1.2083 
1.0168 0.9908 0.9406 1.0460 0.8647 0.9483 0.9064 1.2035 

, и мне нужно, чтобы он был обрезан, чтобы я мог нарисовать неровные столбцы, начинающиеся с общей точки, которая == 1.0000. Окончательный массив выглядит это так, что каждый новый столбец начинается с 1.0000 и имеет значение после каждого 1,0000 непосредственно ниже в колонках:

1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 
0.9717 1.0721 0.9958 1.2324 0.9856 0.9724 0.8863 1.3116 
1.0168 1.0617 0.9705 1.1523 0.9960 0.9483 0.9064 1.2027 
     0.9944 0.9406 0.9677 0.9517    1.2083 
     0.9995  1.0712 0.8877    1.2035 
     0.9908  1.0691 1.0006 
         1.0460 1.0369 
           0.8943 
           0.8647 
+0

Большинство функций рисования в MATLAB игнорируемых 'NaN', так что ваши матрица может работать как есть ... Как вы пытаетесь построить ее? –

+0

Да, NaN игнорируется на базовом графике, но построенные значения (cols) начинаются с оси x на основе того, где они расположены в пространстве строк и столбцов в исходной матрице. Мне нужно, чтобы все графики начинались с оси x в x == 1, и у меня есть много других матриц для построения так, чтобы я искал решение, применимое обычно к другим матрицам, таким как исходная матрица, показанная здесь. thanks- – user2100039

ответ

1

Вы можете сдвигать Nans в нижнюю часть матрицы, которую я назвал A:

B = NaN(size(A)); 
idx = ~isnan(A); 
B(flipud(idx)) = A(idx); 

% then simply plot 
plot(B) 
+0

+1: очень хорошее решение :) –

+0

Я тоже это проверил, и это еще лучше. благодаря, – user2100039

1

Matlab не поддерживает матрицы переменной длины. Вам нужно будет создать ячейку, для которой потребуется другая (возможно, настраиваемая) функция построения графика. Как вы думаете, такой сюжет будет выглядеть? Как говорит Роди, многие функции графика игнорируют NaN. Некоторые базовый код для создания такой ячейки будет:

MyCell=cell(1,size(MyMatrix,2)); % Make a cell with same number of columns as your matrix 
for v = 1:size(MyMatrix,2) 
    MyCell{v}=MyMatrix(~isnan(MyMatrix(:,v)),v); % For each column, find the NaN values, and then select the opposite, and put it into entry "v" of the cell 
end 

Альтернативно

MyCell{v}=MyMatrix(isfinite(MyMatrix(:,v)),v); 

будут удалены все значения Inf, а также любые пренебрежимо малых.

EDIT: В ответ на ваш комментарий, функция для построения как вы описали бы:

function CellLinePlot(MyCell) 
    figure; 
    J=jet(length(MyCell)); % Make a colormap with one entry for each entry in the cell 
    for v=1:length(MyCell) 
     line(1:length(MyCell{v}),MyCell{v},'color',J(v,:)); % draw a line with y values equal to the cell contents, and x values equal to the number of points 
    end 
+0

блестящий - он отлично работает! Я не уверен, что понимаю, но я изучу его. Спасибо большое - – user2100039

+0

Добавил несколько комментариев, чтобы попробовать и помочь. –

2

Вы можете перемещать NaN значения в конце колонны и избежать различных размеров для колонн. Таким образом, функция графика работает отлично. Вот один из способов сделать это:

function C = relocateNaN(A) 
C=zeros(size(A)); 
B=sum(isnan(A)); 
for k=1:size(A,2), 
    C(:,k) = [A(B(k)+1:end,k); A(1:B(k),k)]; 
end 
end