ternaire operator in matlab

is er een manier om te typen voor als:

var = (cond) ? true : false;

of moeten we dit formaat gebruiken?

if (cond)
 true
else
 false
end

Antwoord 1, autoriteit 100%

MatLab heeft geen ternaire operator of een andere syntactische suiker voor eenregelige if-statements. Maar als je if-statement heel eenvoudig is, kun je het toch in één regel schrijven:

if (cond); casetrue(); else; casefalse(); end

Het is niet zo eenvoudig als een ternaire operator, maar nog steeds beter dan het in 5 regels code te schrijven.


Antwoord 2, autoriteit 42%

Hmm… niemand heeft dit genoemd

fi = @(varargin)varargin{end-varargin{1}}

ergens in de documenten staat het ‘einde’ komt eraan, dus dit zal meer toekomstbestendig zijn

fi = @(varargin)varargin{length(varargin)-varargin{1}}

Gebruik:

fi(input('Do you like Matlab ? '),'yes','no')
>> no

Als je inline cases nodig hebt, ga dan naar Mathworks


Antwoord 3, autoriteit 39%

Als je alleen waar of onwaar nodig hebt, kun je doen wat MatlabSortersuggereert. Als je een echte tertiaire operator wilt (d.w.z. a = b ? c : d), is er geen in MATLAB. Als u echter het hiergeleverde bestand gebruikt, kunt u kan dichtbij komen.


Antwoord 4, autoriteit 30%

Je kunt doen

var = 5 > 4;

die var op true zet. Vervang gewoon wat je nodig hebt voor 5 > 4.


Antwoord 5, autoriteit 24%

MATLAB heeft geen voorwaardelijke expressies, maar in sommige situaties kun je een soortgelijk effect krijgen door bijvoorbeeld var = cond*true_expr + (1-cond)*false_exprte zeggen. In tegenstelling tot de voorwaardelijke expressie van C, zal dit natuurlijk altijd zowel true_exprals false_exprevalueren, en als condtoevallig niet 0 of 1 is (let op : falsegedraagt zich als 0; truegedraagt zich als 1) je krijgt gekke resultaten.


Antwoord 6, autoriteit 9%

Vervangen

c = (x ? a : b)

door

c = subsref({b; a}, substruct('{}', {x + 1}))

x moet een booleaanse waarde zijn of 1 of 0.
waar of 1 selecteert een
false of 0 selecteert b
Dit zou moeten werken met alles wat cellen kunnen bevatten en kan ook worden gebruikt in een ingewikkelde formule!


Antwoord 7, autoriteit 9%

Snel en elegant. Ik zou gewoon tern( a>b, a, b) schrijven
Nadeel is dat je overal moet kopiëren, of een extra bestand in de map moet hebben

function b = tern(cond, a, b)
    if cond
        b=a;
    end
end

Antwoord 8, autoriteit 6%

@Leonid Beschastny heeft gelijk wat betreft het inlinen van de if-else-end-instructie, maar als het moet, dan kan men met elke toewijzingswaarde die als booleaans kan worden geëvalueerd de sneltoets booleaanse operatoren ||en &&:

(cond) && ((var=true_val)||1) || (var=false_val);

Regels:

  1. shortcut boolean ops ||en &&moeten worden gebruikt, NIET|of &
  2. werkt met booleaanse, numerieke en char-toewijzingen
  3. zal NIETwerken met celarray of functiehandvatten
  4. de opdrachten moeten tussen haakjes staan.
  5. (var=true_val)moet worden gevolgd door ||1voor het geval true_val == false
  6. trueen falsetoewijzingen kunnen aan verschillende variabelen zijn (dwz (var1=true_val)terwijl (var2=false_val))
  7. true_valen false_valkunnen verschillende typen zijn, op voorwaarde dat ze elk als booleaans kunnen worden geëvalueerd

Als alternatief kan men dit doen:

cond && (func1(..)||1) || func2(...);

op voorwaarde dat func1en func2een booleaanse testbare waarde retourneren die helemaal niets bevat (maar geen celarrays!):


Antwoord 9, autoriteit 3%

Ik gebruik deze stijl vaak:

cond = what < ever;
n = getfield([23,42], {1+(what < ever)}) % for any 1x1-data
s = cell2mat(getfield({'no','yes'}, {1+(what < ever)})) % for nonuniform

het is compact genoeg om geen hulpfunctie nodig te hebben

Other episodes