【问题标题】:Compare arrays in matlab by elements按元素比较matlab中的数组
【发布时间】:2014-09-03 14:31:57
【问题描述】:

我想在 MATLAB 中逐个元素地比较多个数组;如果它们在任何位置相等,则增加计数。 (即整个数组不必相等,只要比较第一次发现元素相等就足够了。例如A=[1 2 3]B=[4 2 5],这里的位置2相等。)

我试过isequal(A,B):比较所有元素并返回计数10; 但是isequal(A[i], B[i]); 不能将数字逐个元素地进行比较。

你能建议任何解决方案吗..

【问题讨论】:

  • 你的意思是:find(A==B, 1, 'first')?
  • 你能举一个三个数组的例子吗?你如何拥有这些多个数组?它们是矩阵行吗?
  • 例如:A=[1 2 9] B=[4 5 9] C=[7 8 9];这里所有数组的长度相同,并且在索引 3 处它们是相等的。它们是行
  • @jagan: 好的,如果你有多个数组,将它们连接为矩阵行,然后使用:find(all(diff([A;B;C])==0), 1, 'first')(类似于 LuisMendo 在下面显示的内容)。这将返回索引3

标签: arrays matlab compare equality


【解决方案1】:

使用 for 循环,使用索引计数器逐一遍历数组的索引并逐一比较数组的元素。

【讨论】:

    【解决方案2】:

    根据您的问题,我不确定您想要什么。我假设,给定一组具有相同列数的行向量,您想知道 多少所有 这些向量具有相同的值(但值每列可以不同)。

    我还假设您的数据是矩阵行的形式,例如

     data = [ 1 2 9 3 5
              4 5 9 3 5 
              7 8 9 2 5 ];
    

    然后:

    result = sum(all(diff(data)==0));
    

    在这种情况下,结果是 2,因为在 列(第三和第五)处满足相等条件。


    如果要查找第一个列的索引,其中至少有两个行具有相等的值:

     result = find(any(diff(sort(data))==0),1);
    

    例如,

    data = [ 1 8 9 3 5
             4 5 9 3 5 
             7 8 9 2 5 ];
    

    将给出2,因为第二列是具有相同值的第一列。

    【讨论】:

    • 感谢您的回复;
    • 感谢您的回复;我的问题:我有 3 个长度相同的数组。正如您在此处的示例中提到的索引 3(值 9)它们相等,因此设置结果 = 1,这就足够了。但不要找到“总和”(整个数组中有多少次相等的值)。我需要找出我发现比较变得相等的时间。
    • @jagan 所以你想要第一列的所有向量都具有相同的值?
    • 爵士:Luis Mendo:不必这样。任何两个值在一个列中都相等,那么它就可以了。也就是说,当我们查看一个列时,如果同一数字有多个(2 个或更多)条目,那么它必须返回该列索引。谢谢
    • @jagan 只返回发生这种情况的第一列?或者发生这种情况的所有列?
    【解决方案3】:

    试试:

    if(sum(A == B))
        % increment your counter
    end;
    

    编辑:

    为什么起作用:(A == B) 返回一个新数组,其中一个在 A 和 B 的 pleces 上具有相同的值,否则为零。 “Sum”对这个新数组求和,如果这个和不为零(即 A 和 B 在同一位置至少有一个共同值),则触发“if”。否则 sum 返回零,if 语句将其视为“false”。

    【讨论】:

      【解决方案4】:

      如果您有 3 个大小相同的数组(A、B 和 C),并且您只想知道等式在哪里,您可以使用:

      R(:,:,1) = bsxfun(@eq,A,B);
      R(:,:,2) = bsxfun(@eq,C,B);
      R(:,:,3) = bsxfun(@eq,A,C);
      IDX = find(R);
      [Rows,Columns,~] = ind2sub(size(R),IDX);
      

      这将为您提供两个向量,其中包含所有等式的行和列位置。我用数组试过这个:

      A = [4 6 2 4
           3 5 4 4];
      B = [6 2 6 3 
           2 1 4 4];
      C = [4 4 4 2
           4 5 6 1];
      

      得到了

      Rows = [2 2 1 2]
      Columns = [3 4 1 2]
      

      这确实与各种等式的位置相关。如果你想找到第一个位置,只需运行:

      CL = min(Columns);
      RW = min(Rows(Columns == CL));
      

      这将为您提供第一个等式的行列索引。在上面的例子中,它给出了RW = 1, CL = 1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-20
        • 1970-01-01
        • 2016-03-25
        • 1970-01-01
        • 2014-01-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多