type if x is a square matrix statement
Afficher commentaires plus anciens
Hi, How do I write the script for "If x is a square matrix funcz will be the 0"?
Thanks!
1 commentaire
Jan
le 27 Oct 2017
A bullet-proof solution is not trivial. Therefore this question is more interesting than it looks like on first glance.
Réponses (3)
funcz = ~diff(size(x))
5 commentaires
Jan
le 26 Oct 2017
This fails for a [2,2,2] array.
@Stephen: You are right. "0 if x is square matrix" might or might not imply that 1 is replied otherwise e.g. for nD arrays. Anyway, Lin will find enough details in this thread to solve the problem.
We need ~ismatrix(x), because 0 is wanted as output. But then ~diff(size(x)) replies a vector for nD arrays and the && is not applicable. What about:
~(ismatrix(x) && diff(size(x)))
Then the short-circuting should avoid the evaluation of the 2nd part, such that the "&& needs scalar input" problem does not occur.
Stephen23
le 26 Oct 2017
@Jan Simon: thank you, that is a tidy solution for ND arrays.
Zhuoying Lin
le 26 Oct 2017
funcz = ~ismatrix(x) || (size(x, 1) ~= size(x, 2));
or with Matlab versions before R2010b:
funcz = (ndims(x) ~= 2) || (size(x, 1) ~= size(x, 2));
This rejects [0 x 1] matrices, but is is questionable, if an empty matrix can be non-square.
To reply funcz=0 for vectors:
funcz = (ndims(x) ~= 2) || all(size(x) ~= 1);
or with modern Matlab versions:
funcz = ~isvector(x)
michio
le 26 Oct 2017
[nRow,nCol] = size(x);
if nRow == nCol
funcz = 0;
end
3 commentaires
Zhuoying Lin
le 26 Oct 2017
This fails for a [4,2,2] array:
[nR, nC] = size(rand(4, 2, 2))
nR = 4, nC = 4
michio
le 27 Oct 2017
Yes, it assumes that the array is 2D. Interesting thread :)
Catégories
En savoir plus sur Logical dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!