2016-09-30 15 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

相关问题