题目
编写程序,对比两种简短选择逻辑:实现当 $x > 0$ 时取值 $A$、否则取值 $B$ 的模式。展示使用短逻辑运算以及辅助元胞技巧替代冗长的四行 if-else 语句。
输入格式:无需外部输入。
输出格式:输出两种简洁写法求得的目标值。
数据范围与约定:紧凑语法技巧。
思路与算法
1. 缺少三元运算符
MATLAB/Octave 没有 C 语言的 cond ? a : b 三元操作符。很多初学者写了大量臃肿的 4 行 `if-else`。
2. 元胞切片选择技巧
经典技巧:choices = {val_false, val_true}; result = choices{(x > 0) + 1};。利用逻辑值 0 和 1 加上 1 变成索引 1 或 2,直接从元胞提取,简洁且无分支。
3. 数值级乘法选择
对于纯数值:result = (x > 0) * val_true + (x <= 0) * val_false;,天然支持向多维数组广播。
完整程序
% Octave / MATLAB 第49题:简短选择逻辑技巧
x = 15;
% 传统冗长写法
if x > 10
label1 = "HIGH";
else
label1 = "LOW";
end
% 技巧 1:元胞索引法 (利用 boolean + 1 索引)
% false(0) + 1 = 1 -> "LOW"
% true(1) + 1 = 2 -> "HIGH"
choices = {"LOW", "HIGH"};
label2 = choices{(x > 10) + 1};
% 技巧 2:数值加权选择 (纯向量化)
score = 8;
discount = (score >= 10) * 0.8 + (score < 10) * 0.95;
fprintf("x = %d 时 label1 = %s\n", x, label1);
fprintf("元胞选择 label2 = %s\n", label2);
fprintf("数值加权计算折扣 discount = %.2f\n", discount);运行示例
输出:
x = 15 时 label1 = HIGH
元胞选择 label2 = HIGH
数值加权计算折扣 discount = 0.95