【问题标题】:Getting row and column numbers of valid elements in a matrix获取矩阵中有效元素的行号和列号
【发布时间】:2015-07-03 16:09:39
【问题描述】:

我有一个 3x3 矩阵,填充了 NaN 和一个变量的值:

NaN 7   NaN
5   NaN 0
NaN NaN 4

matrix = [NaN 7 NaN; 5 NaN 0; NaN NaN 4]

我想获取非 NaN 单元格的行号和列号,并将它们与变量的值一起放入矩阵中。也就是我想得到如下矩阵:

row col value
1   2   7
2   1   5
2   3   0
3   3   4

want = [1   2   7; 2   1   5; 2   3   0; 3   3   4]

任何帮助将不胜感激。

【问题讨论】:

    标签: matlab matrix


    【解决方案1】:

    这可以在没有循环的情况下完成:

    [jj, ii, kk] = find((~isnan(matrix).*(reshape(1:numel(matrix), size(matrix)))).');
    result = [ii jj matrix(kk)];
    

    诀窍是将~isnan(matrix) 乘以索引矩阵,以便find 的第三个输出给出非NaN 条目的linear index。转置需要与问题中的顺序相同。

    【讨论】:

      【解决方案2】:

      以下应该可以工作!

      [p,q]=find(~isnan(matrix)) % Loops through matrix to find indices
      
      want = zeros(numel(p),3) % three columns you need with same number of rows as p
      
      for i=1:numel(p)
          want[i,:] = [p(i) q(i) matrix(p(i), matrix(i))]
      end
      

      应该给你正确的结果是:

       2     1     5
       1     2     7
       2     3     0
       3     3     4
      

      【讨论】:

      • 亲爱的@ha9u63ar,非常感谢您的解决方案!对于这篇文章的未来读者,z[i,:] 应替换为 z(i,:) 并且 a(p(i), q(i)) 应替换为 matrix(p(i), q(i )) .
      • @user3618451 愚蠢的我。感谢您指出了这一点!我现在改了。
      【解决方案3】:

      如果您不介意行的顺序,可以使用 Luis Mendo 的答案的简化版本:

      [row, col] = find(~isnan(matrix));
      result = [row(:), col(:), matrix(~isnan(matrix))];
      

      这将导致:

       2     1     5
       1     2     7
       2     3     0
       3     3     4
      

      【讨论】:

        猜你喜欢
        • 2011-11-16
        • 2015-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-11
        相关资源
        最近更新 更多