我想将所有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,并且需要能够为任意数量的不同数字进行练习。
答案 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