Testing for identical numbers in matrix columns
Show older comments
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 Comments
Andrew Newell
on 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
on 3 Mar 2011
There you go - one vote already!
Accepted Answer
More Answers (2)
Jos (10584)
on 3 Mar 2011
Nothing shorter than:
~std(A)
4 Comments
Konstantin
on 3 Mar 2011
Matt Tearle
on 3 Mar 2011
Jos wins today's internets
Oisín Moran
on 17 Jan 2018
Edited: Oisín Moran
on 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
Jan
on 17 Jan 2018
@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.
Andrew Newell
on 3 Mar 2011
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 Comments
Konstantin
on 3 Mar 2011
MICHAEL MONT-ETON
on 22 Jul 2020
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.
Categories
Find more on Creating and Concatenating Matrices in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!