2016-09-30 4 views
3

行列Aのすべて1を列1に入れ、すべて2を列2などに入れたいと思います。すべてのNaNは残りの空のセルに配置されます。列1にすべて1を、列2に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 

EDITを取得したいと思います:一般的なケースでは、私は、より多くの数{1,2、...、N}とを有しますNaNであり、任意の数の異なる数の演習を行うことができる必要があります。このコードは、あなたが達成しようとしている何をすべき

+1

@AnderBiguriは 'A'はちょうどそれが表示さを示すために、私は信じて、問題の2回繰り返しました。問題は「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の代わりにnumers 1,2,3を使用すると一般的に使用できますか? – Maria

+0

すでにありますが、1つの列に1つの列を入れたいので、Aを正しく設定する必要があります(k x n列を意味します)。そうでなければ、Bとforループを編集できます。B = NaN(size(A、1)、max(max(A)))、i = 1:size(B、2)私はMatlabでこのコードを試していませんが、うまくいくはずです。 – merch

関連する問題