2010-03-14 85 views
7

Bất kỳ ai có thể cho tôi biết nếu có cách nào (trong MATLAB) để kiểm tra xem một giá trị nhất định có bằng bất kỳ giá trị nào được lưu trữ trong mảng khác không? Cách tôi dự định sử dụng nó là kiểm tra xem một chỉ mục phần tử trong một ma trận có bằng với các giá trị được lưu trữ trong một mảng khác không (nơi các giá trị được lưu trữ là các chỉ số của các phần tử đáp ứng một tiêu chí nhất định).Tìm xem liệu giá trị có bằng với giá trị của bất kỳ phần tử mảng nào trong MATLAB

Vì vậy, nếu các chỉ số của các yếu tố đáp ứng các tiêu chí được lưu trữ trong ma trận dưới đây:

criteriacheck = [3 5 6 8 20]; 

Đi qua các mảng chính (gọi tắt là array) và kiểm tra nếu các trận đấu chỉ số:

for i = 1:numel(array) 
    if i == 'Any value stored in criteriacheck' 
    %# "Do this" 
    end 
end 

Có ai có ý tưởng về cách tôi có thể thực hiện việc này không?

Trả lời

3

bạn có thể sử dụng lệnh find

if (~isempty(find(criteriacheck == i))) 
    % do something 
end 
19

Các tuyệt vời answer previously given by @woodchips áp dụng ở đây cũng như:

Nhiều cách để làm điều này. ismember là lần đầu tiên bạn nghĩ đến, vì nó là một hành động thành viên được thiết lập mà bạn muốn thực hiện. Do đó,

X = primes(20); 
ismember([15 17],X) 
ans = 
     0 1 

Vì 15 không phải là số nguyên tố, nhưng 17, là thành viên đã làm tốt công việc của mình tại đây.

Tất nhiên, tìm (hoặc bất kỳ) cũng sẽ hoạt động. Nhưng đây không phải là vectorized theo nghĩa mà ismember được. Chúng ta có thể kiểm tra xem liệu 15 có nằm trong tập hợp được biểu diễn bằng X hay không, nhưng để kiểm tra cả hai con số đó sẽ có một vòng lặp hay các phép thử liên tiếp.

~isempty(find(X == 15)) 
~isempty(find(X == 17)) 

hay,

any(X == 15) 
any(X == 17) 

Cuối cùng, tôi sẽ chỉ ra rằng các xét nghiệm cho các giá trị chính xác là nguy hiểm nếu những con số có thể nổi sự thật. Các thử nghiệm so với các giá trị số nguyên như tôi đã chỉ ra rất dễ dàng. Nhưng các thử nghiệm đối với các số dấu phẩy động thường phải sử dụng một sự khoan dung.

tol = 10*eps; 
any(abs(X - 3.1415926535897932384) <= tol) 
3

Lưu ý: Mặc dù câu trả lời này không giải quyết các câu hỏi trong tiêu đề, nó giải quyết một vấn đề cơ bản hơn với cách bạn đang thiết kế của bạn cho vòng lặp (các giải pháp trong đó phủ nhận có liên quan tới những gì bạn đang yêu cầu trong tiêu đề). ;)

Dựa trên vòng lặp bạn đã viết, mảng của bạn criteriacheck dường như là một tập hợp các chỉ mục thành array và cho từng yếu tố được lập chỉ mục mà bạn muốn thực hiện một số tính toán. Nếu đây là như vậy, đây là một cách khác để bạn có thể thiết kế cho vòng lặp:

for i = criteriacheck 
    %# Do something with array(i) 
end 

Điều này sẽ lặp qua tất cả các giá trị trong criteriacheck, thiết i cho mỗi giá trị tiếp theo (tức là 3, 5, 6, 8, và 20 trong ví dụ của bạn). Điều này gọn nhẹ và hiệu quả hơn so với vòng lặp trên mỗi phần tử của array và kiểm tra xem chỉ mục có nằm trong criteriacheck hay không.

LƯU Ý: Như Jonas chỉ ra, bạn muốn đảm bảo criteriacheck là vectơ hàng cho vòng lặp cho hoạt động bình thường. Bạn có thể tạo bất kỳ ma trận vào một vector hàng bằng cách làm theo nó với cú pháp (:)', mà reshapes it into a column vector và sau đó transposes it vào một vector hàng:

for i = criteriacheck(:)' 
... 
+1

Lưu ý rằng criteriacheck cần phải là vectơ hàng, tức là [3,5,6 ...], thay vì [3; 5; 6 ...]. Để an toàn, tôi sẽ viết << cho i = criteriacheck (:) '>>. Ở mức nào, +1 – Jonas

+0

@ Jonas: Ý tưởng hay, chỉ để được an toàn. ;) – gnovice

1

Các câu hỏi ban đầu "bất cứ ai có thể cho tôi biết nếu có một cách (trong MATLAB) để kiểm tra xem một giá trị nhất định có bằng bất kỳ giá trị nào được lưu trữ trong một mảng khác không? " có thể được giải quyết mà không cần bất kỳ vòng lặp nào.

Chỉ cần sử dụng chức năng setdiff.

0

Tôi nghĩ chức năng INTERSECT là những gì bạn đang tìm kiếm.

C = giao nhau (A, B) trả về các giá trị chung cho cả A và B. Giá trị của C được sắp xếp theo thứ tự sắp xếp.

http://www.mathworks.de/de/help/matlab/ref/intersect.html

Câu hỏi đặt ra if i == 'Any value stored in criteriacheck cũng có thể được trả lời theo cách này nếu bạn xem xét i một ma trận tầm thường. Tuy nhiên, bạn nên sử dụng tốt hơn với any(i==criteriacheck)

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