2017-03-07 86 views
4

我刚刚发现any('')返回逻辑0的声明,而声明all('')返回逻辑1为什么任何('')返回逻辑0,而所有('')返回逻辑1?

如果函数any并不认为空字符串(“”)为非零,函数all也应该这样做,但是从结果,功能all似乎认为空字符串(“”)为非零。

顺便说一句,类似的事情也发生在那里any(NaN)返回逻辑0,而all(NaN)返回逻辑1.

它是一个MATLAB的bug?

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

+0

也许将它添加到列表中http://stackoverflow.com/questions/1710299/corner-cases-unexpected-and-unusual-matlab?rq=1 – Thilo

+9

这不是一个错误。任何(X)意味着你可以找到X的元素是真的;对于没有元素,你不能。 all(X)表示你找不到X的元素是false;对于没有元素,你不能。比较∀,∃,并查看https:// stackoverflow。com/questions/2195289/why-does-iqueryable-all-return-true-on-an-empty-collection,https://stackoverflow.com/questions/30223079/why-does-stream-allmatch-return-true- for-an-empty-stream,https://stackoverflow.com/questions/19601802/how-does-all-in-python-work-on-empty-lists,https://stackoverflow.com/questions/16662727/为什么此结果全返回真上一个空数组。 – Ryan

回答

5

根据文档
定义的any

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

在实践中, any是逻辑OR运算符的自然延伸。

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

all定义:

所有(x)的...确定该元件都是非零或逻辑1(真)

在实践中,all是自然逻辑AND运算符的扩展。

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

我们可以实现两种功能:

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是逻辑或运算,我们使用||
- 因为我们应该检查nonzero数字,我们用V(k) ~= 0
- 因为我们应该检查非零numbersNaNNot a Number我们使用~isnan(V(k))的自然延伸。

-In all我们假设所有的元素是非零[所以所有是那些],我们希望证明假设是错误的,所以我们提供的true
- 因为all的初始值是逻辑的自然延伸AND运算符我们使用&&
- 因为我们要检查我们使用V(k) ~= 0
- 因为的all定义并不强制该非零元素是数字非零,我们不使用~isnan(V(k))

+0

感谢您的详细回复。我想我理解你的解释。我还仔细检查了文档(的确,'any'函数忽略了NaN值,而'all'函数没有提及它]并运行你提供的2个函数,结果证明了你的解释。 –

2

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

全部返回1,因为它的所有元素都是真的。只要它的所有要素都不是虚假的,它的所有要素都是真实的,而且它的要素都不是虚假的。

1

这是方便和CON在数值的空列表上应用联想操作返回中性元素的那个操作时,其余的数学运算。这就是为什么

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

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

0

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

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

如果A是一个空0逐0矩阵,任何(A)返回逻辑0(假)。该函数的

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

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

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