将所有1的矩阵放在第1列中,将2s放在第2列等中,将NaN放在空单元格中

时间:2016-09-30 09:49:45

标签: matlab sorting matrix

我想将所有1放在第1列,将所有2放在矩阵A的第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 个答案:

答案 0 :(得分: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