如何检查矩阵列中的所有条目是否相等(在MATLAB中)?

时间:2015-08-03 23:09:59

标签: arrays performance matlab matrix

我有一个长度增长的矩阵,例如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中如何有效地编写代码?

5 个答案:

答案 0 :(得分:0)

你可以用这个:

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

答案 1 :(得分:0)

我们假设您有矩阵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 :(得分:0)

让我试一试:

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

答案 3 :(得分:0)

要查找最后一列,使得每列直接包含相同的值:

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

答案 4 :(得分:-1)

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

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

如果需要,您还可以查看查找结果。