Testing for identical numbers in matrix columns

Hello!
I'm not a stupid, I just want to learn to use MATLAB effectively.
I have a matrix. In my work it is 64x64, for example let's see this one
A =
1 2 3 4
2 3 3 4
6 7 2 4
I want to now, in which columns all numbers are equal. I know how to do it for one column
A = [1,2,3,4; 2,3,3,4; 6,7,2,4];
REZ(1) = all((A(1,1)==A(:,1)));
Of course I can do this operation in cycle, but i think there is method to do it in one line.
If I run
>> X=(1:4);
>> REZ_2(X)=((A(1,X)==(A(:,X))));
It doesn't work, with error
??? Error using ==> eq
Matrix dimensions must agree.
How to solve this problem elegant?

2 commentaires

Andrew Newell
Andrew Newell le 3 Mar 2011
Konstantin, it's not a stupid question, and it might even pick up a vote or two if you change the title to a more descriptive one (for example, "Which matrix columns have all numbers equal?").
Andrew Newell
Andrew Newell le 3 Mar 2011
There you go - one vote already!

Connectez-vous pour commenter.

 Réponse acceptée

Matt Tearle
Matt Tearle le 3 Mar 2011
all(~diff(A))
Like Andrew's idea, but a bit neater(?). The not (~) converts the differences to logicals (0 difference -> true). Then all sees if all the differences in a column are 0.
Just for fun, here's another possibility:
all(bsxfun(@eq,A,A(1,:)))
(This actually has one advantage, in that it would work even if A has only one row!)

2 commentaires

My votes goes to the BSXFUN solution.
Andrew Newell
Andrew Newell le 3 Mar 2011
I prefer the ALL version because it's not very interesting to say that each element is equal to itself.

Connectez-vous pour commenter.

Plus de réponses (2)

Jos (10584)
Jos (10584) le 3 Mar 2011
Nothing shorter than:
~std(A)

4 commentaires

Konstantin
Konstantin le 3 Mar 2011
brilliant!
Matt Tearle
Matt Tearle le 3 Mar 2011
Jos wins today's internets
Oisín Moran
Oisín Moran le 17 Jan 2018
Modifié(e) : Oisín Moran le 17 Jan 2018
I know this was 7 years ago but for anyone coming across this now it is not guaranteed to work. For example:
~std(0.9*ones(6,1))
Returns
ans =
logical
1
Whereas
~std(0.9*ones(7,1))
Returns
ans =
logical
0
@Oisín Moran: You are right:
std(0.9*ones(7,1))
>> 1.1992e-16
A rounding problem. This is not reliable also:
std(A) < 10*eps
The limit must reflect the size of the inputs and the summation to get mean(a), which is required for std is not stable.

Connectez-vous pour commenter.

Here is one way:
find(~sum(abs(diff(A))))
The idea is that diff takes the differences between adjacent terms in a column, and if all the elements are the same then sum(abs(diff(A)))=0 (the abs is needed in case positive and negative differences cancel out). Then ~sum(abs(diff(A)))=1 only for columns in which all the elements are equal.

2 commentaires

Konstantin
Konstantin le 3 Mar 2011
Thank you very much!
I love this community)
Thanks for this solution. I plan on using it in my research into inverse solutions for the groundwater equation- a variant of the Laplace equation. It will be used to determine if a particular row or column in the input array is homogeneous. I will credit Mr.Newell in the code, and in publication.

Connectez-vous pour commenter.

Catégories

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by