2013-04-18 30 views
6

Tôi có một vấn đề đơn giản là tôi đang tìm cách triển khai nhanh trong Matlab. Tôi có một mảng các giá trị, chúng ta hãy nói:Hoạt động với || và && các toán tử phải được chuyển đổi thành các giá trị vô hướng lô-gic

a = floor(rand(5,5).*255) 

Sau đó tôi có một mảng ngưỡng kích thước tương tự, giả sử đó là:

a_thresh = floor(rand(5,5).*255) 

Đối với các giá trị trong vòng a nếu họ là 0.5x nhỏ hơn tương ứng giá trị trong a_thresh tôi muốn đầu ra là 0 - tương tự cho 1.2x giá trị trong a_thresh cũng cần được thiết lập để không, tức:

a(a < a_thresh.*0.4) = 0 
a(a > a_thresh.*1.2) = 0 

Đối với các giá trị giữa 0,4x và 0,5x và 1,0x và 1,2x tôi muốn có một số tiền tỷ lệ và khác giữa 0,5 và 1,0 tôi muốn sử dụng giá trị a không thay đổi gì. Tôi nghĩ tôi có thể sử dụng giống như sau:

a(a>= a_thresh .* 0.4 && a <a_thresh.* 0.5) = ((a - a_thresh.*0.4)/(a_thresh.*0.5 a_thresh.*0.4)) .* a; 

Tuy nhiên, tôi nhận được một lỗi nói rằng:

Phép toán để || và các hoạt động & & phải được chuyển đổi thành giá trị vô hướng hợp lý

Bất kỳ lời khuyên nào về cách giải quyết vấn đề này? Rõ ràng tôi có thể sử dụng vòng lặp để làm điều này và nó sẽ là tầm thường, nhưng tôi muốn giữ mã được vector hóa.

Trả lời

14

Điều về && là nó chỉ có thể hoạt động trên vô hướng, trong khi & cũng có thể hoạt động trên mảng. Bạn nên thay đổi && thành & để làm cho nó hoạt động (bạn có thể đọc thêm về nó trong this question).

Cập nhật:
Về vấn đề thứ hai của bạn được mô tả trong một chú thích: số phần tử bên trái là khác nhau bởi vì bạn đang sử dụng chỉ số (chỉ chọn một số yếu tố), và bên phải bạn đang làm việc với toàn bộ ma trận aa_thresh.

Bạn cần phải sử dụng các chỉ số trong cả hai bên, vì vậy tôi khuyên bạn nên lưu trữ nó trong một biến và sau đó sử dụng nó như một subscript mảng, cùng những dòng này:

idx = (a >= a_thresh*0.4 & a < a_thresh*0.5); 
a(idx) = ((a(idx)-a_thresh(idx)*0.4) ./ (a_thresh(idx)*0.5*a_thresh(idx)*0.4)) .* a(idx); 

Tôi không chắc chắn nếu tính riêng của mình là chính xác, vì vậy tôi sẽ để nó cho bạn kiểm tra.

+0

Tuyệt vời - giải quyết vấn đề &/&& - Tôi biết một số cách không biết điều đó, cảm ơn! Bây giờ tôi có một vấn đề nhỏ mà số lượng các yếu tố bên phải là khác nhau từ bên trái. Có một cách thông minh để sửa lỗi này? – trican

+0

@trican Tôi đã làm việc đó, vui lòng xem cập nhật. –

+1

Rất nhiều người, cảm ơn Eitan - giải pháp của bạn hoạt động hoàn hảo - và rõ ràng là đủ chung để tôi có thể thấy cách tôi có thể sử dụng nó ở nơi khác trong công việc Matlab của mình – trican

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