【问题标题】:How to check if all the entries in columns of a matrix are equal (in MATLAB)?如何检查矩阵列中的所有条目是否相等(在MATLAB中)?
【发布时间】:2015-10-26 04:51:00
【问题描述】:

我有一个不断增长的矩阵,例如一个 4×x 矩阵 A,其中 x 在一个循环中增加。我想找到最小的列 c ,其中之前的所有列都带有一个数字。矩阵 A 可以如下所示:

A = [1 2 3 4;
     1 2 3 5;
     1 2 3 1;
     1 2 3 0];

c=3x=4 的位置。

在循环的每次迭代中,A 的长度会增长,索引 c 的值也会增长。因此,在每次迭代中,我都想更新c 的值。我在 Matlab 中编码的效率如何?

【问题讨论】:

  • 如果您在A 的末尾添加列,x 仍将是 3。您将何时以及如何更新第 4 列?
  • 再一次,如果第 4 列没有改变,c 将如何改变以使该列中的所有元素都具有相同的值?
  • @beaker 第 4 列也随着矩阵的增长而变化。例如,当 x 为 100 时,c 可能为 90。我不确定我的观点是否正确。 c 是最后一个全等列的索引。
  • @Elnaz 如果您的矩阵是4 by x,那么您只有 4 列。因此,前 90 列永远不会相等。 (只是试图解释为什么您的问题令人困惑)也许您有一个大小为r by x 的矩阵?并且可以任意增长?
  • @Elnaz 向我们展示上面的矩阵A 的增长示例。

标签: arrays performance matlab matrix


【解决方案1】:

假设您有矩阵 A,并且您想检查特定列 ii 以查看其所有元素是否相同。代码是:

all(A(:, ii)==A(1, ii)) % checks if all elements in column are same as first element

另外,请记住,一旦条件被破坏,x 就不能再更新了。因此,您的代码应该是:

x = 0;
while true
    %% expand A by one column

    if ~all(A(:, x)==A(1, x)) % true if all elements in column are not the same as first element
        break;
    end
    x = x+1;
end

【讨论】:

    【解决方案2】:

    你可以用这个:

    c = find(arrayfun(@(ind)all(A(1, ind)==A(:, ind)), 1:x), 1, 'first');
    

    这会找到并非所有值都相同的第一列。如果您在循环中运行它,您可以检测列中的条目何时开始不同:

    for x = 1:maxX
      % grow A
    
      c = find(arrayfun(@(ind)~all(A(1, ind)==A(:, ind)), 1:x), 1, 'first');
      % If c is empty, all columns have values equal to first row.
      % Otherwise, we have to subtract 1 to get the number of columns with equal values
      if isempty(c)
        c = x;
      else
        c = c - 1;
      end
    
    end
    

    【讨论】:

    • 我试过了,还是不行。我用全零初始化 A,这给了我最后一个全零列,在此之前有不相等的列。
    • 我不想要最后一个全等列。例如,A 可以有 100 列,其中 1 到 89 列是全等的。我想要 x=89。
    • 如果您使用“编辑”下的建议,您将找到不同的第一列。如果从该数字中减去 1,您将得到 x。当然,如果没有不同值的列,结果将为空。
    • 是的,谢谢,但我买不起循环,因为长度很大。
    • 也许你应该重写这个问题。因为它意味着你正在循环增长A。但是,如果您不是,则在编辑下给出的行应该会产生所需的结果。
    【解决方案3】:

    我也试一试:

    % Find the columns which's elements are same and sum the logical array up
    c = sum(A(1,:) == power(prod(A,1), 1/size(A,1)))
    d=size(A,2)
    

    【讨论】:

      【解决方案4】:

      要找到最后一列,使得直到该列的每一列都包含相等的值:

      c = find(any(diff(A,1,1),1),1)-1;
      

      c = find(any(bsxfun(@ne, A, A(1,:)),1),1)-1;
      

      例如:

      >> A = [1 2 3 4 5 6;
              1 2 3 5 5 7;
              1 2 3 1 5 0;
              1 2 3 0 5 8];
      >> c = find(any(diff(A,1,1),1),1)-1
      c =
           3
      

      【讨论】:

        【解决方案5】:

        你可以试试这个(简单快捷):

        Equal_test = A(1,:)==A(2,:)& A(2,:)==A(3,:)&A(3,:)==A(4,:);
        c=find(Equal_test==false,1,'first')-1;
        

        您也可以根据需要查看查找结果。

        【讨论】:

        • 提到A是一个按列增长的矩阵
        • @Lati 所以你必须比较行!!!我不明白你为什么要否决这个答案!!!
        • 是的,在这种情况下它有效,我实际上并没有尝试过,抱歉。但是如果你有,比如说 100 行,那么在你的方程中写下所有的逻辑测试会很痛苦。投反对票的不是我,不止一个感叹确实没有任何意义。
        猜你喜欢
        • 2013-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-30
        • 2019-03-09
        • 1970-01-01
        • 2017-04-11
        • 1970-01-01
        相关资源
        最近更新 更多