【问题标题】: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

【问题讨论】:

标签: matlab


【解决方案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
- 因为我们应该检查非零值 numbers 和 NaN 是 Not 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】:

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

      函数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的空字符数组(我刚找到)。这解释了我最初的问题,来自文档。

      【讨论】:

        猜你喜欢
        • 2017-10-18
        • 2013-01-21
        • 1970-01-01
        • 2019-07-22
        • 1970-01-01
        • 2021-12-15
        • 2017-03-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多