matlab中的三元运算符
Posted
技术标签:
【中文标题】matlab中的三元运算符【英文标题】:ternary operator in matlab 【发布时间】:2011-08-01 11:36:27 【问题描述】:有没有办法输入 if like:
var = (cond) ? true : false;
还是我们必须使用这种格式?
if (cond)
true
else
false
end
【问题讨论】:
但对于更一般的情况,请在此处查看一些答案:***.com/questions/27561881/… 【参考方案1】:快速而优雅。我会简单地写 tern(a>b, a, b) 缺点是你必须到处复制粘贴,或者在目录中有额外的文件
function b = tern(cond, a, b)
if cond
b=a;
end
end
【讨论】:
【参考方案2】:@Leonid Beschastny 关于内联if-else-end
语句是正确的,但如果必须,那么对于任何可以评估为布尔值的赋值值,都可以使用快捷布尔运算符||
和&&
:
(cond) && ((var=true_val)||1) || (var=false_val);
规则:
-
必须使用快捷布尔操作
||
和&&
,不能 |
或&
可用于布尔、数字和字符赋值
将不使用元胞数组或函数句柄
作业必须用括号括起来。
(var=true_val)
后面必须跟||1
以防true_val == false
true 和 false 分配可能针对不同的变量(即(var1=true_val)
而(var2=false_val)
)
true_val
和 false_val
可以是不同的类型,前提是每个类型都可以评估为布尔值
也可以这样做:
cond && (func1(..)||1) || func2(...);
如果 func1
和 func2
返回一个可测试的布尔值,不包括任何内容(但不包括元胞数组!):
【讨论】:
这是哪个 Matlab 版本?我有 R2018a,分配 var=true_val 不起作用。 Matlab 报语法错误。【参考方案3】:替换
c = (x ? a : b)
通过
c = subsref(b; a, substruct('', x + 1))
x 应该是一个布尔值或 1 或 0。 true 或 1 将选择一个 false 或 0 将选择 b 这应该适用于所有单元格可以包含的内容,也可以用于复杂的公式!
【讨论】:
注意:a 和 b 都被评估。这可能与 if ... else ... end 有所不同。【参考方案4】:我经常使用这种风格:
cond = what < ever;
n = getfield([23,42], 1+(what < ever)) % for any 1x1-data
s = cell2mat(getfield('no','yes', 1+(what < ever))) % for nonuniform
它足够紧凑,不需要辅助函数
【讨论】:
【参考方案5】:嗯...没有人提到这个
fi = @(varargin)vararginend-varargin1
在文档中某处写着“结束”即将到来,因此这将是更多的未来证明
fi = @(varargin)vararginlength(varargin)-varargin1
用法:
fi(input('Do you like Matlab ? '),'yes','no')
>> no
如果您需要内联案例,请参阅Mathworks ...
【讨论】:
【参考方案6】:MatLab 没有三元运算符,也没有任何其他用于单行 if 语句的语法糖。但是如果你的 if 语句真的很简单,你也可以只写一行:
if (cond); casetrue(); else; casefalse(); end
它不像三元运算符那么简单,但还是比用5行代码写的要好。
【讨论】:
无论多么简单,Matlab 中的 lambda/匿名函数定义都不支持 if/switch/loop 语句。【参考方案7】:MATLAB 没有条件表达式,但在某些情况下,您可以通过说,例如 var = cond*true_expr + (1-cond)*false_expr
来获得类似的效果。与 C 的条件表达式不同,这当然总是计算 true_expr
和 false_expr
,如果 cond
恰好不是 0 或 1(注意:false
的行为类似于 0;true
的行为类似于 1)你会得到疯狂的结果。
【讨论】:
应该可以创建一个接受一个条件和两个函数句柄的函数。然后你就有了想要的快捷方式行为。 优雅但仅适用于数字表达式,我尝试使用字符串并将它们作为 ASCII 值数组返回 如果true_expr
或false_expr
是inf
,这也不起作用【参考方案8】:
如果你只需要真假,你可以按照MatlabSorter
的建议去做。如果您想要一个真正的三级运算符(即a = b ? c : d
),MATLAB 中没有。但是,使用here 提供的文件,您可以接近。
【讨论】:
【参考方案9】:你可以的
var = 5 > 4;
这会将 var 设置为 true。只需将您需要的替换为 5 > 4。
【讨论】:
不,您可以使用 (a > b) 作为因子,然后添加另一个具有相反语句的产品:var = (a < 0) * (-a) + (a >= 0) * (a)
如果我们需要在 disp 或 fprintf 中使用三元运算符?以上是关于matlab中的三元运算符的主要内容,如果未能解决你的问题,请参考以下文章