【问题标题】:Put all 1s of matrix in column 1, 2s in column 2 etc. and NaNs in empty cells将矩阵的所有 1 放入第 1 列,将 2 放入第 2 列等,将 NaN 放入空单元格
【发布时间】:2016-09-30 09:49:45
【问题描述】:

我想将所有 1 放入矩阵 A 的第 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 并且需要能够对任意数量的不同数字进行练习。

【问题讨论】:

  • @AnderBiguri A 在问题中被重复了,我相信第二次只是为了显示它。问题是:有A,如何获得B
  • 是的,确实是这样。

标签: matlab sorting matrix


【解决方案1】:

这段代码应该能达到你想要达到的效果:

%% 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

【讨论】:

  • 别担心,我刚刚更新了代码让它变得更好。
  • 感谢您的建议。这与数字 1,2,3 完美配合,但可以将其设为通用,因此如果我有数字 1、2、3、...、N 而不是只有 1、2 和 3,我可以使用它吗?
  • 已经是了,但是由于您希望每个数字有一列,您应该正确设置 A (意思是 k x n 列)。否则,您可以编辑 B 和 for 循环:B = NaN(size(A, 1), max(max(A))) 和 for i=1:size(B, 2)。我没有在 Matlab 上尝试过这段代码,但它应该可以工作。
  • 太棒了! repmat 3D 和这个 squeeze 技巧......我花了一个小时尝试做同样的事情!好答案!
  • 好答案。您展示了 4 种不同的技术...足以说明您删除了我的所有选项以提供另一个答案:-)。
猜你喜欢
  • 2018-11-12
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-26
  • 1970-01-01
  • 2015-04-04
  • 1970-01-01
相关资源
最近更新 更多