2011-03-07 29 views
8

Tôi có một lưới lưới định nghĩa làĐặt tất cả các yếu tố ma trận khác không đến 1 (trong khi vẫn giữ những người khác 0)

[X, Y, Z] = meshgrid(-100:100, -100:100, 25); % z will have more values later 

và hai hình dạng (hình bầu dục, trong trường hợp này):

x_offset_1 = 40; 
x_offset_2 = -x_offset_1; 
o1 = ((X-x_offset_1).^2./(2*Z).^2+Y.^2./Z.^2 <= 1); 
o2 = ((X-x_offset_2).^2./(2*Z).^2+Y.^2./Z.^2 <= 1); 

Bây giờ , Tôi muốn tìm tất cả các điểm không khác trong hoặc hình bầu dục. Tôi cố gắng

union = o1+o2; 

nhưng kể từ khi tôi chỉ cần thêm chúng, khu vực chồng chéo sẽ có một giá trị của 2 thay vì mong muốn 1.

Làm thế nào tôi có thể thiết lập tất cả mục khác không trong ma trận là 1, bất kể giá trị trước đó của họ?

(Tôi đã thử normalized_union = union./union;, nhưng sau đó tôi kết thúc với NaN trong tất cả các yếu tố 0 vì tôi chia cho zero ...)

Trả lời

15

giải pháp đơn giản nhất: A=A~=0;, nơi A là ma trận của bạn.

Điều này chỉ thực hiện thao tác lôgic để kiểm tra xem mỗi phần tử có bằng không. Vì vậy, nó trả về 1 nếu phần tử không khác và 0 nếu nó bằng 0.

+0

Hoàn hảo, cảm ơn! Bạn đã quá nhanh, SO sẽ không để tôi đánh dấu câu trả lời của bạn như được chấp nhận cho đến 6 phút nữa: P –

6

Đề xuất đầu tiên: không sử dụng union làm tên biến, vì điều này sẽ làm nổi bật chức năng được tích hợp union. Tôi muốn đề nghị sử dụng tên biến inEitherOval thay vì nó mô tả nhiều hơn ...

Bây giờ, một lựa chọn bạn có là để làm một cái gì đó giống như những gì abcd suggests trong đó bạn thêm các ma trận của bạn o1o2 và sử dụng relational not equal to operator:

inEitherOval = (o1+o2) ~= 0; 

Một vài khả năng khác trong bối cảnh đó sử dụng not toán tử logic hoặc chức năng logical:

inEitherOval = ~~(o1+o2);  % Double negation 
inEitherOval = logical(o1+o2); % Convert to logical type 

Tuy nhiên, các giải pháp cô đọng nhất là áp dụng các toán tử logic or trực tiếp đến o1o2:

inEitherOval = o1|o2; 

nào sẽ dẫn đến một giá trị là 1 nơi một trong hai ma trận không phải là zero và không khác.

+0

'union' chỉ là thứ tôi đưa ra trong câu hỏi này - trong mã thực sự của tôi, tôi có tên biến tương ứng với các hình bầu dục đại diện, do đó, nó không phải là một vấn đề. Cảm ơn tất cả các đề xuất tốt! –

2

Có một giải pháp đơn giản khác, A = lôgic (A)

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