【问题标题】:Find the rows of a matrix with conditions concerning the values of certain columns in matlab在matlab中查找具有与某些列的值有关的条件的矩阵的行
【发布时间】:2015-10-24 10:04:28
【问题描述】:

正如标题所说,我想找到 Matlab 矩阵中的所有行,在某些列中,该行中的值与前一行中的值相等,或者一般来说,在矩阵中的某些行中相等。例如我有一个矩阵

1 2 3 4
1 2 8 10
4 5 7 9
2 3 6 4
1 2 4 7

我想找到以下行:

1 2 3 4 
1 2 3 10
1 2 4 7

我该如何做这样的事情,以及我通常如何为第 1 列和第 2 列中的所有可能对执行此操作,并且在矩阵中存在的前行中具有相等的值?

【问题讨论】:

    标签: matlab find rows


    【解决方案1】:

    这是一个开始,看看我们是否朝着正确的方向前进:

    >> M = [1 2 3 4;
         1 2 8 10;
         4 5 7 9;
         2 3 6 4;
         1 2 4 7];
    
    >> N = M;  %// copy M into a new matrix so we can modify it
    >> idx = ismember(N(:,1:2), N(1,1:2), 'rows')
    
    idx =
    
       1
       1
       0
       0
       1
    
    >> N(idx, :)
    ans =
    
        1    2    3    4
        1    2    8   10
        1    2    4    7
    

    然后您可以从原始矩阵中删除这些行并重复。

    >> N = N(~idx,:)
    N =
    
       4   5   7   9
       2   3   6   4
    

    【讨论】:

      【解决方案2】:

      这会给你结果

      data1 =[1 2 3 4
      1 2 8 10
      4 5 7 9
      2 3 6 4
      1 2 4 7];
      
      data2 = [1 2 3 4 
      1 2 3 10
      1 2 4 7];
      
      [exists,position] = ismember(data1,data2, 'rows')
      

      exists 向量告诉您该行是否在另一个矩阵上,而 position 为您提供位置...

      一个不那么优雅和简单的版本是

      array_data1 = reshape (data1',[],1);
      array_data2 = reshape (data2',[],1);
      
      matchmatrix = zeros(size(data2,1),size(data1,1));
      for irow1 = 1: size(data2,1)
          for irow2 = 1: size(data1,1)
              matchmatrix(irow1,irow2) = min(data2(irow1,:) == data1(irow2,:))~= 0;
          end
      end
      

      matchmatrix 被读取为一个连接矩阵,其中值为 1 表示 data1 的哪一行与 data2 的哪一行匹配

      【讨论】:

      • 这似乎是作弊。 data2 是 OP 想要得到的答案。您不能将其用作其余代码的输入。
      • @Jeff Irvin:我理解问题的方式是他想在数据 1 中找到数据 2...
      猜你喜欢
      • 1970-01-01
      • 2016-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2018-10-06
      • 1970-01-01
      • 2016-08-16
      相关资源
      最近更新 更多