2017-03-07 73 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剛剛發現它)。這從文檔解釋了我的原始問題。

相關問題