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 MatlabSorter
suggereert. 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_expr
te zeggen. In tegenstelling tot de voorwaardelijke expressie van C, zal dit natuurlijk altijd zowel true_expr
als false_expr
evalueren, en als cond
toevallig niet 0 of 1 is (let op : false
gedraagt zich als 0; true
gedraagt 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:
- shortcut boolean ops
||
en&&
moeten worden gebruikt, NIET|
of&
- werkt met booleaanse, numerieke en char-toewijzingen
- zal NIETwerken met celarray of functiehandvatten
- de opdrachten moeten tussen haakjes staan.
(var=true_val)
moet worden gevolgd door||1
voor het gevaltrue_val == false
- trueen falsetoewijzingen kunnen aan verschillende variabelen zijn (dwz
(var1=true_val)
terwijl(var2=false_val)
) true_val
enfalse_val
kunnen 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 func1
en func2
een 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