2013-01-06 127 views
5

是什麼在MATLAB中|||邏輯運算符之間的區別?|有什麼區別?和||在MATLAB中?

+1

查看文檔:http://www.mathworks.co.uk/help/matlab/matlab_prog/operators.html#f0-38948。 –

+3

相關問題:[在MATLAB中&和&&有什麼區別?](http://stackoverflow.com/questions/1379415/whats-the-difference-between-and-in-matlab) –

回答

0

||用於標量輸入

|取陣列輸入中的if/while語句

source: -

始終使用& &和||需要短路時的操作人員。 使用的elementwise運營商(&和|)用於短路可以 產生意想不到的結果。

+1

這不完全準確。 –

2

邏輯運算符

MATLAB提供三種類型的邏輯operatorsfunctions

  • |是逐元素 - 在相應的邏輯陣列的元素進行操作。
    實施例: 矢量輸入AB

    A = [0 1 1 0 1]; B = [1 1 0 0 1];

    A | B = 11101

  • ||是短路 - 標量操作,邏輯表達式

    實施例:

    ||:返回邏輯1(真),如果任一輸入,或兩者,求值爲真,並且邏輯0(假)如果他們不。

    操作數:含有標量值邏輯表達式。

    A || B(如果A爲假乙只計算)

    A = 1; B = 0;

    C =(A || (B = 1));

    B0該表達式和C is 1之後。

  • 其他是,逐位 - 在對應的整數值或陣列的位進行操作。
    reference link

0

|表示OR作爲logical operator||也是一個邏輯運算符,稱爲short-circuit OR

短路運算符的最大優點是隻有在滿足某些條件時纔可以使用它們來評估表達式。例如,只有當函數文件駐留在當前的MATLAB路徑上時纔想執行函數。短路保持距離產生錯誤下面的代碼文件時,myfun.m,無法找到:

comp = (exist('myfun.m') == 2) && (myfun(x) >= y) 

同樣,這句話避免試圖除以零:

x = (b ~= 0) && (a/b > 18.5) 

你可以還使用&&||運營商在ifwhile語句來把他們的短路行爲的優勢:

if (nargin >= 3) && (ischar(varargin{3})) 
+0

這重複了問題中提到的信息。 –

+0

我在移動網絡上出現了一個嚇人的網絡,甚至沒有看到有其他答案。有人可以在我的文章中格式化代碼。 – bonCodigo

+0

很好,我想我必須自己做。這是另一篇你可能想看的文章。當我走到一臺機器前時,我會格式化這篇文章。 http://stackoverflow.com/questions/1379415/whats-the-difference-between-and-in-matlab – bonCodigo

5

我確定您已閱讀short-circuiting operatorselement-wise operators的文檔。

一個重要的區別是,元素式操作符可以在陣列上操作,而短路操作符只能應用於標量邏輯操作數。

但是,關鍵的區別可能是短路問題。對於短路操作符,表達式從左到右進行評估,只要最終結果可以確定,則不評估剩餘術語。

例如,考慮

x = a && b 

如果a評估爲false,那麼我們就知道a && b計算結果爲false不論什麼b計算爲。所以沒有必要評估b

現在考慮這個表達式:

NeedToMakeExpensiveFunctionCall && ExpensiveFunctionCall 

我們想象ExpensiveFunctionCall需要很長的時間來評估。如果我們可以執行其他便宜的測試,允許我們跳過ExpensiveFunctionCall的呼叫,那麼我們可以避免調用ExpensiveFunctionCall。因此,假設NeedToMakeExpensiveFunctionCall評估爲false。在那種情況下,因爲我們使用了短路操作符,所以不會調用ExpensiveFunctionCall

相反,如果我們使用逐元素運營商並寫了這樣的功能:

NeedToMakeExpensiveFunctionCall & ExpensiveFunctionCall 

然後調用ExpensiveFunctionCall永遠不會被跳過。

其實MATLAB documentation,這一點我希望大家看了,包括說明了一點很好很好的例子:

x = (b ~= 0) && (a/b > 18.5) 

在這種情況下,我們不能執行a/b如果b爲零。因此測試b ~= 0。使用短路運算符意味着當b爲零時我們避免計算a/b,因此避免出現運行時錯誤。顯然,基於元素的邏輯運算符將無法避免運行時錯誤。

關於短路評估的更多討論,請參考Wikipedia article的主題。

+3

+1:值得注意的是,'|'可以在數組上操作,而'||'只能在標量上操作。此外,[Loren Shure](http://blogs.mathworks.com/loren/)指出[這裏](http://stackoverflow.com/a/1393606/1336150)'''也可能短路( !!),但只在'if' /'while'語句中。 –

0

短路||表示僅在必要時纔會評估參數。 在我們的示例expr1 || expr2中,如果expr1的計算結果爲TRUE,則不需要評估第二個操作數 - 結果將始終爲TRUE。如果你有一個長鏈短路操作員A || B || C || D,你的第一個評估爲真,那麼其他人將不會被評估。

如果您將元素邏輯|替換爲A | B | C | D,則將評估所有元素,而不管先前的操作數如何。

相關問題