gpt4 book ai didi

matlab - 三元运算在 Octave 中有效吗?

转载 作者:行者123 更新时间:2023-12-03 16:31:47 24 4
gpt4 key购买 nike

问题 三元运算是否有效,因为我无法在网上找到任何与之相关的文档。而且我还发现在 中三元是不可能的MATLAB 所以任何建议和答案都将在这里受到赞赏。
#带三元运算的代码

taxes = (income > 50000)*(((income-50000) * 0.20)+(0.10*50000)) + (~(income > 50000))*0.10 *50000
#Condition True and this computation False then this computation

#带有if和else的代码
if (income) > 50000
#income = income - 50000
#Taxed at 10% (i.e 0.10) for $ 50000
#taxes = 50000 * 0.10
#Rest income will be Taxed at 20% (i.e 0.20)
taxes = 50000 * 0.10 + ((income-50000) * 0.20)
else
#Taxed at 10% (i.e 0.10)
taxes = income * 0.10
endif
输出:
GNU Octave, version 6.1.0
Copyright (C) 2020 The Octave Project Developers.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. For details, type 'warranty'.

Octave was configured for "x86_64-w64-mingw32".

Additional information about Octave is available at https://www.octave.org.

Please contribute if you find this software useful.
For more information, visit https://www.octave.org/get-involved.html

Read https://www.octave.org/bugs.html to learn how to submit bug reports.
For information about changes from previous versions, type 'news'.

>> income = 60000;
>> compute_taxes
taxes = 7000
>> income = 50000;
>> compute_taxes
taxes = 5000
>>

最佳答案

任何语言中三元运算符的任何定义与 if 语句之间存在一些重要区别。
主要是后者是一个语句,而三元运算符根据定义是一个表达式。换句话说,您希望它返回一个值。 Octave/matlab 中的 if 块不会“返回”一个值(即你不能做 a = if ... endif )。如果您需要“返回”的内容,则需要将其分配给循环内的外部变量,然后在循环外使用该变量。
第二件大事是三元运算符应该是可链接的。即你应该能够做“如果这个,那么那个,否则如果那个,那么其他事情”,这样在长比较链的末尾你返回一个单一的值。

现在,octave 和 matlab 没有这种运算符。但是在 Octave 中,很容易模拟一个,例如与细胞:

M1 = false; M2 = false; M3 = true;
{'expression1', 'expression2', 'expression3', 'fallback'}([ M1, M2, M3, true ]){1}
如果你真的想要,你可以把那种东西变成一个很好的匿名函数,它返回第一个掩码/测试为真的表达式:
tern = @(varargin) reshape(varargin,2,[])(2,:)([reshape(varargin,2,[]){1,:}]){1}
tern( M1, 1, M2, 2, M3, 3, true, 4 ) % ans = 3
其中“回退”是通过在“回退”值之前明确评估为“真”的测试来实现的。
注意:这种在匿名函数中“链接”两个或多个索引操作的风格仅适用于 Octave 音阶,因为不幸的是 matlab 不允许链接操作,例如 a(1)(2) .没有什么能阻止你制作一个等效的“适当的”外部函数,在第二次索引它之前,你将中间结果保存到一个临时变量;因此,从概念上讲,该策略也适用于 matlab。

或者,您可以使用稍微不同的语法制作一个更简单的“三元运算符”(好吧,函数),其中分别传递“测试/掩码”数组、“表达式”和“回退”单元格。例如。
tern2 = @(M,E,F) [E, F]{find([M, true], 1)}
tern2( [M1, M2, M3], {1, 2, 3}, {4} ) % ans = 3

最后,还有 ifelse函数,精神上类似,即 ifelse(test, expr_if_true, expr_if_false) ,但这并不是真正的三元运算符/函数,因为它不可链接;基于“真/假掩码”在两个替代方案之间进行选择更有用,例如
ifelse( [M1, M2, M3], {1, 2, 3}, {4,5,6} )
% ans = { 4, 5, 3 }

关于matlab - 三元运算在 Octave 中有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66055370/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com