使用短路或(||)时仅能比较标量?BMI计算器MATLAB代码报错排查
MATLAB BMI计算器逻辑运算符报错问题
在编程课制作BMI计算器时,需要限制height(身高)和weight(体重)的数值范围,但运行代码时反复出现报错:
逻辑运算符(&& 和 ||)的操作数必须能转换为逻辑标量值。请使用ANY或ALL函数将操作数缩减为逻辑标量值。
我原本以为float是标量,搞不懂问题出在哪,以下是我的MATLAB代码:
weight = input("please enter your weight in kgs: ","s"); str2double(weight) while isnan(weight) weight = input("please enter your weight in kgs: ","s"); str2double(weight); end height = input("please enter your size in meters: ", "s"); str2double(height) h = isscalar(size) w = isscalar(height) while isnan(height) || height > 2.2 || height < 1.3 hight = input("please enter your size in meters: ","s"); str2double(height); end
示例输入输出
- 输入:
please enter your weight in kgs: 70
输出:ans = 70 - 输入:
please enter your size in meters: 1.87
输出:ans = 1.8700 h = logical 0 w = logical 0
问题根源与修复方案
未保留数值转换结果
调用str2double(weight)和str2double(height)后,没有把转换后的数值赋值回原变量,导致weight和height始终是字符串类型。字符串无法参与数值比较,且isnan对字符串调用会返回逻辑数组而非标量,直接触发逻辑运算符的报错。变量名拼写错误
身高校验循环里把height误写为hight,导致输入的新值无法赋值给目标变量,循环逻辑完全失效。错误使用内置函数名
size是MATLAB内置函数,isscalar(size)判断的是函数句柄是否为标量,和身高的标量判断毫无关系,属于逻辑误用。
修复后的代码:
% 处理体重输入,确保为有效数值 weight_str = input("please enter your weight in kgs: ","s"); weight = str2double(weight_str); while isnan(weight) weight_str = input("please enter your weight in kgs: ","s"); weight = str2double(weight_str); end % 处理身高输入,限制范围1.3-2.2米 height_str = input("please enter your size in meters: ", "s"); height = str2double(height_str); while isnan(height) || height > 2.2 || height < 1.3 height_str = input("please enter your size in meters: ","s"); height = str2double(height_str); end % 计算并输出BMI bmi = weight / (height^2); disp(["Your BMI is: ", num2str(bmi)])
关键说明
- 必须将
str2double的结果赋值给变量,确保后续操作的是数值类型。 isnan仅支持数值类型,对字符串调用会返回非标量逻辑值,这是触发报错的核心原因。- 避免使用MATLAB内置函数名作为变量名,防止逻辑混乱。
内容的提问来源于stack exchange,提问作者Hauke Jakubowski
相关产品推荐
相关产品推荐

