我在学习MATLAB的使用中有一次在使用if语句的时候遇到了这个报错,当时一直没有弄明白原因,现在解决了之后希望能和大家分享一下。
报错指令的解释
根据剑桥词典:
operand代表数据运算中的运算对象,convertible意为替换,scalar values指标量。那么整个句子的意思就可以理解为:参与逻辑与和逻辑或的运算对象必须转化为标量形式。现在这个问题的原因其实已经很明确了,我想对于大多数朋友来说问题都是一样的,那么就是运算对象选择为了向量(矩阵),我之前的报错代码为一个函数:
function f = fun2(x)
if x>=0
x = mod(x,11);
if x>=0 && x<=2
f = 1;
elseif x>=9 && x<=10
f = 1;
else
f = 0;
end
else
x = mod(-x,11);
if x>=0 && x<=2
f = 1;
elseif x>=9 && x<=10
f = 1;
else
f = 0;
end
end
end
不出意外报错出现,因为我的函数变量x为一个向量。
解决方法
在这里需要注明的是,以下解决方法受到了MATLAB Answer上一个回答的启发,有兴趣的朋友可以移步:MATLAB Answer上的回答
简单来说就是在数据运算的时候想办法指定到每一个元素,我们可以先创建一个大小与原向量相同的向量:
temp = ones(1,numel(x));
然后使用for循环挨个读取并操作:
temp = ones(1,numel(x));
for k = 1:numel(x)
%输入具体的temp(k)与x(k)之间的关系
f = temp;%向量f即为所求
end
我的修改代码如下:
n = -40:1:40;
f_n = fun1(n);
stem(n, f_n);
function f = fun1(x)
temp = ones(1,numel(x));
for k = 1:numel(x)
a = x(k);
if a>=0
a = mod(a,11);
if a>=0 && a<=2
temp(k) = 1;
elseif a>=9 && a<=10
temp(k) = 1;
else
temp(k) = 0;
end
else
a = mod(-a,11);
if a>=0 && a<=2
temp(k) = 1;
elseif a>=9 && a<=10
temp(k) = 1;
else
temp(k) = 0;
end
end
f = temp;
end
end
运行成功