est-il possible de taper si comme:
var = (cond) ? true : false;
ou devons-nous utiliser ce format?
if (cond)
true
else
false
end
MatLab n'a pas d'opérateur ternaire, ni aucun autre sucre syntaxique pour les instructions if d'une ligne. Mais si votre instruction if est vraiment simple, vous pouvez tout de même l'écrire sur une seule ligne:
if (cond); casetrue(); else; casefalse(); end
Ce n'est pas aussi simple qu'un opérateur ternaire, mais c'est encore mieux que de l'écrire en 5 lignes de code.
Si vous n'avez besoin que de vrai ou faux, vous pouvez faire ce que MatlabSorter
suggère. Si vous voulez un véritable opérateur tertiaire (c'est-à-dire a = b ? c : d
), il n'y en a pas dans MATLAB. Cependant, en utilisant le fichier fourni ici , vous pouvez vous en approcher.
Tu peux faire
var = 5 > 4;
ce qui définira var sur true. Remplacez simplement ce dont vous avez besoin par 5> 4.
Hmm ... personne ne l'a mentionné
fi = @(varargin)varargin{end-varargin{1}}
quelque part dans la documentation, il est écrit que la `` fin '' arrive à un, donc ce sera plus à l'épreuve du temps
fi = @(varargin)varargin{length(varargin)-varargin{1}}
Utilisation:
fi(input('Do you like Matlab ? '),'yes','no')
>> no
Si vous avez besoin de cas en ligne voir Mathworks ...
MATLAB n'a pas d'expressions conditionnelles, mais dans certaines situations, vous pouvez obtenir un effet similaire en disant, par exemple, var = cond*true_expr + (1-cond)*false_expr
. Contrairement à l'expression conditionnelle de C, cela évaluera bien sûr toujours les deux true_expr
et false_expr
, et si cond
ne se trouve pas être 0 ou 1 (note: false
se comporte comme 0; true
se comporte comme 1) vous obtiendrez des résultats fous.
Remplacer
c = (x ? a : b)
par
c = subsref({b; a}, substruct('{}', {x + 1}))
x doit être une valeur booléenne ou 1 ou 0.
true ou 1 sélectionnera un
false ou 0 sélectionnera b
Cela devrait fonctionner avec tout ce que les cellules peuvent contenir et peut également être utilisé dans un formulaire complexe!
J'utilise fréquemment ce style:
cond = what < ever;
n = getfield([23,42], {1+(what < ever)}) % for any 1x1-data
s = cell2mat(getfield({'no','yes'}, {1+(what < ever)})) % for nonuniform
il est suffisamment compact pour ne pas nécessiter de fonction d'assistance
@Leonid Beschastny a raison au sujet de l'incrustation du if-else-end
, mais si on le doit, alors avec n'importe quelle valeur d'affectation pouvant être évaluée comme booléenne, on peut utiliser les raccourcis opérateurs booléens ||
et &&
:
(cond) && ((var=true_val)||1) || (var=false_val);
Règles:
||
et &&
doit être utilisé, PAS |
ou &
(var=true_val)
doit être suivi de ||1
au cas où true_val == false
(var1=true_val)
tandis que (var2=false_val)
)true_val
et false_val
peut être de différents types à condition que chacun puisse être évalué comme booléenAlternativement, on peut faire ceci:
cond && (func1(..)||1) || func2(...);
à condition de func1
et func2
retourne une valeur booléenne testable ne comprenant rien du tout (mais pas de tableaux de cellules!):