2016-09-30 18 views
3

我想把矩陣A中的所有1都放在列1中,所有2都放在列2中等等。所有的NaN都應該是放置在剩餘的空單元格中。把所有1的矩陣在列1中,2s在列2等等和NaN在空單元格中

例如,

A = [1 2 3; 1 2 NaN; 1 3 NaN; 2 3 NaN; 2 NaN NaN; 3 NaN NaN; NaN NaN NaN] 
A = 

    1  2  3 
    1  2 NaN 
    1  3 NaN 
    2  3 NaN 
    2 NaN NaN 
    3 NaN NaN 
    NaN NaN NaN 

而且我想獲得

B = 

    1  2  3 
    1  2 NaN 
    1 NaN  3 
    NaN  2  3 
    NaN  2 NaN 
    NaN NaN  3 
    NaN NaN NaN 

編輯:在一般情況下,我有更多的數字{1,2,...,N},然後NaN,並且需要能夠爲任意數量的不同數字進行練習。

+1

@AnderBiguri'A'重複的問題,第二次,我相信,只是爲了顯示它顯示出來。問題是:有'A',如何得到'B'? – NLindros

+0

是的,這確實是個想法。 – Maria

回答

3

此代碼應該做你想達到什麼目的:

%% Initialise 
A = [1 2 3; 1 2 NaN; 1 3 NaN; 2 3 NaN; 2 NaN NaN; 3 NaN NaN; NaN NaN NaN]; 
minA = min(min(A)); 
maxA = max(max(A)); 


%% For-loop example 
B = NaN(size(A, 1), maxA); 

for i=1:size(B, 2) 
    log_i  = sum(A==i, 2)==1; 
    B(log_i, i) = i; 
end 


%% Vectorized form example 
index = minA:maxA; 
index3D = reshape(index, 1, 1, maxA); 

% 3D logical 
check = bsxfun(@eq, repmat(A, 1, 1, maxA), index3D); 

% Set C 
C   = bsxfun(@times, double(check), index3D); 
C   = squeeze(sum(C, 2)); 
C(C<minA) = NaN; % apply NaNs 
+0

不用擔心,我剛剛更新了代碼以使其更好一些。 – merch

+0

感謝您的建議。這與數字1,2,3完美配合,但是它可以做成通用的,所以我可以使用它,如果我使用1,2,3,...,N而不是隻有1,2和3? – Maria

+0

它已經存在了,但是因爲您希望每個數字有一列,所以您應該正確設置A(意思是k x n列)。否則,可以編輯B和for循環:B = NaN(size(A,1),max(max(A))),對於i = 1:size(B,2)。我沒有在Matlab上試過這個代碼,但它應該可以工作。 – merch

相關問題