为啥 any('') 返回逻辑 0 而 all('') 返回逻辑 1?

Posted

技术标签:

【中文标题】为啥 any(\'\') 返回逻辑 0 而 all(\'\') 返回逻辑 1?【英文标题】:Why any('') returns logical 0 while all('') returns logical 1?为什么 any('') 返回逻辑 0 而 all('') 返回逻辑 1? 【发布时间】:2017-07-27 04:14:32 【问题描述】:

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

如果函数any不认为空字符串('')为非零,函数all应该做同样的事情,但从结果来看,函数all似乎认为空字符串(' ') 为非零。

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

这是一个 MATLAB 错误吗?

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

【问题讨论】:

或许将其添加到列表中***.com/questions/1710299/… 这不是错误。 any(X) 表示您可以找到 X 的一个元素为真;对于没有元素,你不能。 all(X) 表示你找不到 X 的一个元素是假的;对于没有元素,你不能。比较 ∀、∃,并查看 ***.com/questions/2195289/…、***.com/questions/30223079/…、***.com/questions/19601802/…、***.com/questions/16662727/…。 【参考方案1】:

根据文档any的定义:

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

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

如果 A 是一个空的 0×0 矩阵,any(A) 返回逻辑 0(假)。

和all的定义:

all(x) ...确定元素是全部非零还是逻辑1(真)

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

如果 A 是一个空的 0×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

解释:

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

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

【讨论】:

感谢您如此详细的回复。我想我明白你的解释。我还仔细检查了文档(确实,any 函数忽略了 NaN 值,而 all 函数没有提及它)并运行您提供的 2 个函数,结果证明了您的解释。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

在空值列表上应用 关联运算 会返回该运算的 中性元素,这很方便且与数学的其余部分保持一致。这就是为什么

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

延伸阅读的关键词:monoid, fold.

【讨论】:

【参考方案4】:

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

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

如果 A 是一个空的 0×0 矩阵,则 any(A) 返回逻辑 0(假)。

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

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

MATLAB中的空字符串其实是一个0×0的空字符数组(我刚找到)。这解释了我最初的问题,来自文档。

【讨论】:

以上是关于为啥 any('') 返回逻辑 0 而 all('') 返回逻辑 1?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中 any,some,all 的用法

R语言all函数any函数判断逻辑向量(logical vector)实战

matlab预备知识

[python] 之all()和any()内置函数

all ,any,abs的使用

为啥我会收到 ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()