为啥 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
- 因为我们应该检查非零值 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的空字符数组(我刚找到)。这解释了我最初的问题,来自文档。
【讨论】:
以上是关于为啥 any('') 返回逻辑 0 而 all('') 返回逻辑 1?的主要内容,如果未能解决你的问题,请参考以下文章
R语言all函数any函数判断逻辑向量(logical vector)实战
为啥我会收到 ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()