Testing for identical numbers in matrix columns
4 ビュー (過去 30 日間)
古いコメントを表示
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 件のコメント
Andrew Newell
2011 年 3 月 3 日
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?").
採用された回答
Matt Tearle
2011 年 3 月 3 日
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 件のコメント
Andrew Newell
2011 年 3 月 3 日
I prefer the ALL version because it's not very interesting to say that each element is equal to itself.
その他の回答 (2 件)
Jos (10584)
2011 年 3 月 3 日
Nothing shorter than:
~std(A)
4 件のコメント
Oisín Moran
2018 年 1 月 17 日
編集済み: Oisín Moran
2018 年 1 月 17 日
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
2018 年 1 月 17 日
@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
2011 年 3 月 3 日
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 件のコメント
MICHAEL MONT-ETON
2020 年 7 月 22 日
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.
参考
カテゴリ
Help Center および File Exchange で Creating and Concatenating Matrices についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!