我刚发现语句any('')
返回逻辑0 ,而语句all('')
返回逻辑1 。
如果函数any
不认为空字符串('')为非零,则函数all
应该相同,但从结果来看,函数all
似乎是认为空字符串('')为非零。
any(NaN)
返回逻辑0而all(NaN)
返回逻辑1的情况下。
这是一个MATLAB错误吗?
以下是我正在使用的MATLAB的版本信息
MATLAB版本:9.1.0.441655(R2016b)
MATLAB许可证编号:DEMO
答案 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
- 因为我们应该检查非零numbers
和NaN
是Not 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)
当在空值列表上应用关联操作时,返回该操作的中性元素时,对数学的其余部分是方便且一致的。这就是为什么
进一步阅读的关键词:monoid,fold。
答案 3 :(得分:0)
我刚刚从有关any
和all
函数的文档中找到了可靠的证据,如下所示。
函数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的空字符数组(我刚发现它)。这解释了我原来的问题,来自文档。