【问题标题】:Why does Matlab returns double as result of logical multiplication?为什么 Matlab 会返回 double 作为逻辑乘法的结果?
【发布时间】:2018-05-08 10:17:07
【问题描述】:
Matlab 作为逻辑乘法的结果返回一个双精度值是否正常?
A=[true false];
B=[false true];
class(A.*B)
输出是
ans =
double
我找到的最好方法是演员表:logical(A.*B),但我觉得它不干净。
【问题讨论】:
-
只需使用logical operators,在本例中为& 或&&,具体取决于输入。您也不需要通过强制转换1 和0 创建逻辑向量,而是使用true 和false。例如A = [true false],或A = true(1, 2)
-
-
您应该阅读this Q&A。您将逻辑数组与算术运算混合在一起,这在许多情况下都有效,因为 Matlab 进行了内部类型器转换。但是,在某些情况下您会遇到问题。
标签:
matlab
logical-operators
【解决方案1】:
在许多语言(包括 Matlab)中,boolean type(在 Matlab 中称为 logical)不是数字类型,即使它具有基础数字类型(就像其他所有类型一样)。它的底层数字类型不过是byte(Matlab 中的uint8),其可能值被限制为0 和1。
在大多数编程语言中,当您尝试在布尔值之间执行算术运算时,编译器会抛出一个错误,告诉您这是不可能的。相反,Matlab 会在继续计算之前将您的 logicals 隐式转换为 double,并让您继续进行而不会出错:
A = [true false]; => A = [1 0];
B = [false true]; => A = [0 1];
ans = A .* B;
whos ans => double
这就是为什么你的结果类型是double。
实际上,如果你想用logicals 执行操作,坚持logical 返回类型……你必须使用逻辑运算符。更多详情:https://mathworks.com/help/matlab/logical-operations.html
实际上,你的结果可以通过以下方式留在logical域中:
res = A & B;
【解决方案2】:
我找到了!简直就是A&B
>> A&B
ans =
0 0
>> class(ans)
ans =
logical