web-dev-qa-db-fra.com

opérateur ternaire dans matlab

est-il possible de taper si comme:

var = (cond) ? true : false;

ou devons-nous utiliser ce format?

if (cond)
 true
else
 false
end
31
Gün Karagöz

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.

27
Leonid Beschastny

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.

11
Darhuuk

Tu peux faire

var = 5 > 4;

ce qui définira var sur true. Remplacez simplement ce dont vous avez besoin par 5> 4.

9
MatlabSorter

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 ...

8
Carel

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.

8
Gareth McCaughan

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!

1
Juergen S.

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

1
rascr

@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:

  1. raccourci opérations booléennes || et && doit être utilisé, PAS | ou &
  2. fonctionnera avec des affectations booléennes, numériques et char
  3. PAS fonctionne avec le tableau de cellules ou les poignées de fonction
  4. les affectations doivent être placées entre parenthèses.
  5. (var=true_val) doit être suivi de ||1 au cas où true_val == false
  6. true et false les affectations peuvent concerner différentes variables (c'est-à-dire (var1=true_val) tandis que (var2=false_val))
  7. true_val et false_val peut être de différents types à condition que chacun puisse être évalué comme booléen

Alternativement, 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!):

0
codechimp