如果使用matlab的过程中,出现以下错误:
Error:Matlab ||和&&运算符的操作数必须能够转换为逻辑标量值
解决:||和&&为值运算, |与&为向量运算,改为|与&。
比如:
clc;clear all;close all;
% y=zeros(1,200);
x=-0.1:0.001:0.1
% for
Es=2*10^5; %钢筋的弹性模量Es(N/mm2)
fy=375; %纵筋屈服强度
ey=fy/Es; %纵筋屈服应变
fu=635.6; %纵筋峰值强度
ks1=4.0;
ks2=25.0;
ks3=40.0;
ks4=fu/fy;
%%%---------------钢筋参数---------------------
%钢筋拉伸和压缩应力应变情况一致。
%主要为钢筋的四个阶段:完全弹性阶段——非线性弹性阶段——屈服阶段——破坏
%
if ((x>-ey)&&(x<=ey))
y=Es*x;
elseif ((x>ey)&&(x<=ks1*ey))
y=fy;
elseif ((x>=-ks1*ey)&&(x<=-ey))
y=-fy;
elseif ((x>ks1*ey)&&(x<=ks3*ey))
y=Es*(ks4*ey+(1-ks4)*(x-ks2*ey)^2/ey/(ks2-ks1)^2);
elseif ((x>-ks3*ey)&&(x<=-ks1*ey))
y=-Es*(ks4*ey+(1-ks4)*(x-ks2*ey)^2/ey/(ks2-ks1)^2);
else
y=0;
end
% end
plot(x,y) ;grid on;
老是显示:运算符的操作数必须能够转换为逻辑标量值,这是为何?
那是因为:
你的x是一个向量啊,x=-0.1:0.001:0.1
你x>ey)&&(x<=ks1*ey这样做判断的话,系统也不知道你要用哪一个x做比较啊。。。
这里先普及一下matlab中&&和&的区别:
逻辑运算符:
&与
|或
~非
“&”和“|”操作符可比较两个标量或两个同阶矩阵.对于矩阵来说必须符合规则,如果A和B都是0-1矩阵,则A&B或A|B也都是0-1矩阵,这个0-1矩阵的元素是A和B对应元素之间逻辑运算的结果,逻辑操作符认定任何非零元素都为真,给出“1”,任何零元素都为假,给出“0”.
非(或逻辑非)是一元操作符,即~A:当A是非零时结果为“0”;当A为“0”时,结果为“1”.因此下列两种表示:
p | (~p) 结果为1.
p & (~p) 结果为0.
any和all函数在连接操作时很有用,设x是0-1向量,如果x中任意有一元素非零时,any(x)返回“1”,否则返回“0”;all(x)函数当x的所有元素非零时,返回“1”,否则也返回“0”.这些函数在if语句中经常被用到.如:
if all(A<5)
do something
end
另外,还有"&&“和”||“运算符,Matlab中的逻辑运算”&&“与”&","||“与”|"的区别如下:
&&和||被称为&和|的short circuit形式,
A&B
(1)首先判断A的逻辑值,然后判断B的值,然后进行逻辑与的计算。
(2)A和B可以为矩阵(e.g. A=[1 0],B=[0 0])。
A&&B
(1)首先判断A的逻辑值,如果A的值为假,就可以判断整个表达式的值为假,就不需要再判断B的值。
(2)A和B不能是矩阵,只能是标量。
"|"与“||”同理。
A&&B 首先判断A的逻辑值,如果A的值为假,就可以判断整个表达式的值为假,就不需要再判断B的值。这种用法非常有用,如果A是一个计算量较小的函数,B是一个计算量较大的函数,那么首先判断A对减少计算量是有好处的。另外这也可以防止类似被0除的错误:
flag=denum~=0 && num/denum>10
if flag
%Do Something
end if
上面的表达式就可以防止denum等于0的情况。当然,如果你希望在判断的时候,对A和B表达式都进行计算,就应该使用标准的&或者|。Matlab中的if和while语句中的逻辑与和逻辑或都是默认使用short-circuit形式。
if flag=denum~=0 && num/denum>10
%Do Something
end if
与
if flag=denum~=0 & num/denum>10
%Do Something
end if
执行的结果一样
其实吧,意义上与C语言相同,&&只能用于逻辑‘与’,结果真有真假,若要表示运算‘与’,应用&。
更一般的“逻辑与(&&) 逻辑或(||)”
逻辑与操作可以应用到任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值;因此,遵循下列规则:
- 如果第一个操作数是对象,则返回第二个操作数;
- 如果第二个操作数是对象,则只有在第一个操作数的求值结果为true 的情况下才会返回该对象;
- 如果两个操作数都是对象,则返回第二个操作数;
- 如果有一个操作数是null,则返回null;
- 如果有一个操作数是NaN,则返回NaN;
- 如果有一个操作数是undefined,则返回undefined;
逻辑与操作属于短路操作,既如果第一个操作数能够决定结果,那么就不会对第二个操作数求值。对于逻辑与操作而言,如果第一个操作数是false,则无论第二个操作数是什么值,结果都不可能是true了。来看下面的例子:
var found = true;
var result = (found&&someUndefinedVariable);
console.log(result);
上述代码执行过程中会发生代码错误,因为变量 someUndefinedVariable
没有声明。由于变量found的值是true,所以逻辑与操作符会继续对变量someUndefinedVariable求值。但是someUndefinedVariable 尚未定义,因此就会导致错误。当found = false,时代码就不会出现错误
逻辑与 ||
与逻辑与操作相似,如果有一个操作数不是布尔值,逻辑与也不一定返回布尔值;此时,它遵循下列规则
- 如果第一个操作数是对象,则返回第一个操作数
- 如果第一个操作数的求值结果是false,则返回第二个操作数
- 如果两个操作数都是对象,则返回第一个操作数
- 如果两个操作数都是null,则返回null
- 如果两个操作数都是NaN,则返回NaN
- 如果两个操作数都是undefined,则返回undefined