2013-06-21 49 views
1

我有一個看起來像這樣的矩陣(10 x 8),我需要重塑爲「可變行長」但列的相同數目,例如以下顯示我當前的矩陣:微調MATLAB陣列保持列

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

大部分繪圖函數忽略'NaN',所以你矩陣可以按原樣工作...你如何繪製它? –

+0

是的,NaN在基本圖中被忽略,但繪圖值(cols)都是從x軸開始的,它們基於它們在原始矩陣的行和列空間中的位置。我需要所有的圖都以x == 1的x軸開始,並且我有許多其他矩陣可以像這樣繪圖,所以我正在尋找一種解決方案來將其一般應用於其他矩陣,如此處所示的原始矩陣。謝謝 – user2100039

回答

1

可以轉移你的NaN矩陣,我把它叫做A的底部:在MATLAB

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

% then simply plot 
plot(B) 
+0

+1:非常好的解決方案:) –

+0

我也檢查過,這是更好的。謝謝, – user2100039

1
Matlab的

不支持可變長度矩陣。您將需要創建一個單元格,這將需要一個不同的(也許是自定義)繪圖功能。你如何看待這樣的情節?正如Rody所說,許多情節功能忽略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文件值以及任何的NaN。

編輯:在回答您的意見,如你所描述將是一個功能繪製:

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值列的末尾,避免對列不同的大小。這樣plot函數就可以正常工作。下面是做這件事的方法之一:

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