2012-06-27 39 views
8

Tôi đang cố gắng tìm một mảng 2d đại diện cho các giá trị tối thiểu của thứ nguyên thứ 3 trong mảng 3D., Ví dụ:Tìm giá trị nhỏ nhất không bằng 0 trong ma trận

a = floor(rand(10,10,3).*100); % representative structure 
b = min(a,[],3); % this finds the minimum but also includes 0 

tôi đã cố gắng sử dụng:

min(a(a>0),3) 

nhưng điều đó là không đúng? Tôi đoán tôi có thể sắp xếp thứ nguyên thứ ba của a và sau đó tìm mức tối thiểu trong 1: depth-1 - nhưng đó không phải là cách hiệu quả nhất?

Mọi suy nghĩ?

+0

Lưu ý rằng nếu bạn sắp xếp, tối thiểu là lần thứ hai (chỉ số 1 nếu chỉ số matlab từ 0) phần tử, bạn không cần phải tìm ra tối thiểu '1: depth-1' nữa. Nhưng có, điều đó vẫn không hiệu quả và phải có cách tốt hơn. – IVlad

+0

Nó phải là 'min (a, [], 3)', nếu không bạn sẽ nhỏ hơn 'a' và 3 – Jonas

+0

Cảm ơn bạn đã chỉ ra lỗi đánh máy Jonas, tôi đã sửa nó ngay bây giờ. – trican

Trả lời

7

Vấn đề là a(a>0) trả về một mảng tuyến tính, do đó bạn sẽ kết thúc với một mức tối thiểu, như trái ngược với một mảng 2D với minima.

Cách an toàn nhất để lấy tối thiểu các giá trị khác 0 là che dấu chúng bằng Inf để các số 0 không can thiệp vào việc tính giá trị tối thiểu.

tmp = a; 
tmp(tmp==0) = Inf; 

b = min(tmp,[],3); 
+0

Đó là tiếc là backfires cho ma trận thưa thớt, vì nó có thể rất tốn kém để gán một giá trị cho tất cả các số không trong một ma trận thưa thớt (lớn). Tôi nhận ra đó không phải là câu hỏi của OP mà chỉ là một FYI. –

3

Một khả năng sẽ đơn giản là làm cho tất cả các giá trị bằng không rất lớn.

Ví dụ, nếu bạn biết rằng không có yếu tố sẽ không bao giờ được lớn hơn 1000 bạn có thể sử dụng

b = min(a+1000*(a==0),[],3) 
+1

sử dụng inf thay vì 1000 – Dan

0

chỉ đơn giản là gán những điểm vô trong đó giá trị là zero nên lúc nào cũng là câu trả lời phút sẽ không được tính không những ..... như a (a == 0) = inf; % sau đó đếm số phút tối thiểu minelement = min (a);

0

loại bỏ các yếu tố từ zero ma trận như thế này:

a = [10 2 0 4 5; 156 1.7 45 23 0 ]; 
    a(a == 0) = NaN;% not a number 
    min(a(:)) 
    >> ans = 1.7 
Các vấn đề liên quan