2013-01-06 81 views
5

Sự khác nhau giữa các toán tử logic ||| trong MATLAB là gì?Sự khác nhau giữa | và || trong MATLAB?

+1

Hãy xem tài liệu: http://www.mathworks.co.uk/help/matlab/matlab_prog/operators.html#f0-38948. –

+3

câu hỏi liên quan: [Sự khác nhau giữa & và && trong MATLAB là gì?] (Http://stackoverflow.com/questions/1379415/whats-the-difference-between-and-in-matlab) –

Trả lời

0

|| được sử dụng cho đầu vào vô hướng

| có đầu vào mảng trong nếu/khi báo cáo

Từ source: -

Luôn sử dụng & & và || các toán tử khi yêu cầu đoản mạch. Sử dụng toán tử theo nguyên tố (& và |) để đoản mạch có thể cho kết quả không mong muốn.

+1

Điều này không hoàn toàn chính xác. –

2

nhà khai thác logic

MATLAB cung cấp ba loại logic operatorsfunctions:

  • | là Element-khôn ngoan - hoạt động trên các yếu tố của mảng logic tương ứng.
    Ví dụ: đầu vào vector AB

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

    A | B = 11101

  • || là ngắn mạch - hoạt động trên vô hướng, biểu thức logic

    Ví dụ:

    ||: Trả về logic 1 (true) nếu một trong hai đầu vào, hoặc cả hai, để đánh giá đúng, và hợp lý 0 (sai) nếu không.

    Toán hạng: biểu thức logic có chứa giá trị vô hướng.

    A || B (B chỉ được đánh giá nếu A là sai)

    A = 1; B = 0;

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

    B0 sau khi biểu hiện này và C is 1.

  • Khác, Bit-wise - hoạt động trên các bit tương ứng của các giá trị số nguyên hoặc mảng.
    reference link

0

| đại diện OR như một logical operator.|| cũng là một toán tử logic được gọi là short-circuit OR

Lợi thế quan trọng nhất của các toán tử ngắn mạch là bạn có thể sử dụng chúng để đánh giá biểu thức chỉ khi một số điều kiện thỏa mãn. Ví dụ, bạn chỉ muốn thực hiện một hàm nếu tệp hàm nằm trên đường dẫn MATLAB hiện tại. Việc chập mạch giữ đoạn mã sau từ tạo ra một lỗi khi tập tin, myfun.m, không thể được tìm thấy:

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

Tương tự như vậy, tuyên bố này tránh cố gắng chia cho zero:

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

Bạn có thể cũng sử dụng các nhà khai thác &&|| trong ifwhile báo cáo để tận dụng lợi thế của hành vi ngắn mạch của họ:

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

Điều này lặp lại thông tin được nêu trong câu hỏi. –

+0

Tôi đang sử dụng mạng di động bị hoảng loạn và thậm chí không thấy câu trả lời nào khác. Ai đó có thể vui lòng định dạng mã trong bài đăng của tôi. – bonCodigo

+0

Tuyệt vời Tôi đoán tôi phải tự mình làm điều đó. Đây là một bài đăng khác mà bạn có thể muốn xem. Tôi sẽ định dạng bài đăng khi tôi đi trước máy. http://stackoverflow.com/questions/1379415/whats-the-difference-between-and-in-matlab – bonCodigo

5

Tôi chắc chắn bạn đã đọc tài liệu cho số short-circuiting operators và cho số element-wise operators.

Một điểm khác biệt quan trọng là các toán tử khôn ngoan có thể hoạt động trên các mảng trong khi các toán tử mạch ngắn chỉ áp dụng cho các toán hạng logic vô hướng.

Nhưng có lẽ sự khác biệt chính là vấn đề đoản mạch. Đối với các toán tử mạch ngắn, biểu thức được đánh giá từ trái sang phải và ngay khi kết quả cuối cùng có thể được xác định chắc chắn, thì các thuật ngữ còn lại không được đánh giá.

Ví dụ, hãy xem xét

x = a && b 

Nếu a đánh giá để false, sau đó chúng ta biết rằng a && b đánh giá để false không phụ thuộc vào những gì b để đánh giá. Vì vậy, không cần đánh giá b.

Bây giờ xem xét biểu thức này:

NeedToMakeExpensiveFunctionCall && ExpensiveFunctionCall 

nơi chúng tôi tưởng tượng rằng ExpensiveFunctionCall mất một thời gian dài để đánh giá. Nếu chúng tôi có thể thực hiện một số thử nghiệm khác, giá rẻ, cho phép chúng tôi bỏ qua cuộc gọi đến ExpensiveFunctionCall, thì chúng tôi có thể tránh gọi ExpensiveFunctionCall.

Vì vậy, giả sử rằng NeedToMakeExpensiveFunctionCall đánh giá là false. Trong trường hợp đó, bởi vì chúng tôi đã sử dụng các toán tử mạch ngắn, nên ExpensiveFunctionCall sẽ không được gọi.

Ngược lại, nếu chúng ta sử dụng các nhà điều hành yếu tố khôn ngoan và viết hàm như thế này:

NeedToMakeExpensiveFunctionCall & ExpensiveFunctionCall 

sau đó cuộc gọi đến ExpensiveFunctionCall sẽ không bao giờ được bỏ qua.

Trong thực tế, MATLAB documentation, mà tôi hy vọng bạn đã đọc, bao gồm một ví dụ tuyệt vời minh họa điểm rất tốt:

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

Trong trường hợp này chúng tôi không thể thực hiện a/b nếu b là zero.Do đó, kiểm tra cho b ~= 0. Việc sử dụng toán tử mạch ngắn có nghĩa là chúng ta tránh tính toán a/b khi b bằng 0 và do đó tránh được lỗi thời gian chạy phát sinh. Rõ ràng toán tử logic-phần tử khôn ngoan sẽ không thể tránh được lỗi thời gian chạy.

Để có cuộc thảo luận dài hơn về đánh giá ngắn mạch, hãy tham khảo Wikipedia article về chủ đề này.

+3

+1: Có thể cần lưu ý rằng '|' có thể hoạt động trên mảng quá, trong khi '||' chỉ trên vô hướng. Hơn nữa, [Loren Shure] (http://blogs.mathworks.com/loren/) chỉ ra [ở đây] (http://stackoverflow.com/a/1393606/1336150) rằng '|' có thể đoản mạch quá (!!), nhưng chỉ trong câu lệnh 'if' /' while'. –

0

Ngắn mạch || có nghĩa là các tham số đó sẽ chỉ được đánh giá nếu cần thiết trong biểu thức. Trong ví dụ của chúng tôi expr1 || expr2 nếu expr1 đánh giá là TRUE, không cần đánh giá toán hạng thứ hai - kết quả sẽ luôn là TRUE. Nếu bạn có một chuỗi dài các nhà khai thác ngắn mạch A || B || C || D và đánh giá đầu tiên của bạn là đúng, thì những người khác sẽ không được đánh giá.

Nếu bạn thay thế hợp lý theo nguyên tắc | thành A | B | C | D thì tất cả các phần tử sẽ được đánh giá bất kể toán hạng trước đó.

Các vấn đề liên quan