为什么任何('')返回逻辑0而所有('')返回逻辑1?

时间:2017-03-07 04:12:50

标签: matlab

我刚发现语句any('')返回逻辑0 ,而语句all('')返回逻辑1

如果函数any不认为空字符串('')为非零,则函数all应该相同,但从结果来看,函数all似乎是认为空字符串('')为非零。

顺便说一句,类似的事情发生在any(NaN)返回逻辑0而all(NaN)返回逻辑1的情况下。

这是一个MATLAB错误吗?

以下是我正在使用的MATLAB的版本信息 MATLAB版本:9.1.0.441655(R2016b)
MATLAB许可证编号:DEMO

4 个答案:

答案 0 :(得分:5)

根据文件
any的定义:

  

any(x)...确定是否有任何元素是非零数或逻辑1(真)

     

实际上,any是逻辑OR运算符的自然扩展。

     

如果A是0-by-0的空矩阵,any(A)返回逻辑0(false)。

all的定义:

  

all(x)...确定元素是否全部非零或逻辑1(true)

     

实际上,all是逻辑AND运算符的自然扩展。

     

如果A是0-by-0的空矩阵,则all(A)返回逻辑1(true)。

我们可以实现这两个功能:

function out = Any(V)
    out = false;
    for k = 1:numel(V)
        out = out || (~isnan(V(k)) && V(k) ~= 0);
    end
end

function out = All(V)
    out = true;
    for k = 1:numel(V)
        out = out && (V(k) ~= 0);
    end
end

说明:

-In any我们假设所有元素都不是非零[所以都是零],我们想证明假设是错误的,所以我们提供false的初始值。
- 因为any是逻辑OR运算符的自然扩展,我们使用||
- 因为我们应该检查nonzero号码,我们使用V(k) ~= 0
- 因为我们应该检查非零numbersNaNNot a Number,我们使用~isnan(V(k))

-In all我们假设所有元素都是非零[所以都是1]我们想要证明假设是错误的,所以我们提供的初始值为true
- 因为all是逻辑AND运算符的自然扩展,我们使用&&
- 因为我们应该检查非零值,我们使用V(k) ~= 0
- 因为all的定义并没有强制将非零元素作为数字,我们不会使用~isnan(V(k))

答案 1 :(得分:2)

任何返回0都是因为它的任何元素都不是真的。如果任何元素为真,则any子句为真。

All返回1,因为它的所有元素都是真的。只要它的元素都不是假的,它的所有元素都是真的,并且它的元素都不是假的。

答案 2 :(得分:1)

当在空值列表上应用关联操作时,返回该操作的中性元素时,对数学的其余部分是方便且一致的。这就是为什么

  • 零数之和为0
  • 零数的乘积是1
  • 逻辑或零布尔值为假
  • 逻辑和零布尔是真的

进一步阅读的关键词:monoid,fold。

答案 3 :(得分:0)

我刚刚从有关anyall函数的文档中找到了可靠的证据,如下所示。

函数any 的文档 https://www.mathworks.com/help/matlab/ref/any.html

  

如果A是0-by-0的空矩阵,则任何(A)返回逻辑0(false)。

函数all 的文档 https://www.mathworks.com/help/matlab/ref/all.html

  

如果A是一个空的0乘0矩阵,则所有(A)返回逻辑1(真)。

MATLAB中的空字符串实际上是一个0×0的空字符数组(我刚发现它)。这解释了我原来的问题,来自文档。