2009-12-06 36 views
10

tôi sử dụng mã này để tạo ra và vẽ N điểm:Làm cách nào để chọn ngẫu nhiên điểm k từ N điểm trong MATLAB?

N=input('No. of Nodes:'); 
data = rand(N,2) % Randomly generated n no. of nodes 
x = data(:,1); 
y = data(:,2); 
plot(x,y,'*'); 

Làm thế nào để chọn k điểm (với xác suất p=0.25) ra khỏi N điểm, sau đó tô màu các phần k điểm màu đỏ và để lại các điểm khác như *.

+1

Phát biểu cuối cùng của bạn xung đột với chính nó. Bạn có muốn chọn ngẫu nhiên giá trị 'k' từ các giá trị' N' hay bạn muốn chọn giá trị ngẫu nhiên từ vectơ 'N' có độ dài bằng xác suất' p'? Hai cách tiếp cận này có thể có kết quả khác nhau. – gnovice

Trả lời

27

Có hai cách tiếp cận bạn có thể thực hiện. Giải pháp đầu tiên là chọn ngẫu nhiên các giá trị k từ các giá trị N, đảm bảo rằng bạn luôn luônk điểm được chọn. Giải pháp thứ hai là chọn giá trị ngẫu nhiên với mỗi giá trị có xác suất trung bình p được chọn, điều này có thể dẫn đến ít nhất là 0 hoặc nhiều nhất là N được chọn ngẫu nhiên.

  • Chọn k từ N giá trị:

    Bạn có thể sử dụng chức năng RANDPERM để tạo ra một hoán vị ngẫu nhiên của các số nguyên 1 qua N, sau đó chọn k giá trị đầu tiên trong danh sách hoán vị và replot họ màu đỏ:

    index = randperm(N); 
    plot(x(index(1:k)),y(index(1:k)),'r*'); 
    
  • giá trị Đón khách với một xác suất trung bình p:

    Bạn có thể sử dụng RAND chức năng để chọn một giá trị ngẫu nhiên 0-1 cho mỗi N giá trị của bạn, sau đó chọn những người có một giá trị ngẫu nhiên nhỏ hơn hoặc bằng với bạn xác suất trung bình p và replot chúng như đỏ:

    index = (rand(N,1) <= p); 
    plot(x(index),y(index),'r*'); 
    
+0

cảm ơn rất nhiều, câu trả lời thứ hai là hoàn hảo cho tôi. – gurwinder

+0

hoặc sử dụng ['randsample'] (http://www.mathworks.com/help/toolbox/stats/randsample.html) đối với trường hợp đầu tiên. – chaohuang

3

Từ những gì tôi hiểu, đối với mỗi người trong số các điểm ngẫu nhiên N bạn muốn lật một đồng xu để quyết định xem có nên Sel vv hay không (nơi đồng xu có một xác suất p=0.25 thành công!)

data = rand(N,2);    %# generate random points 
index = (rand(N,1) <= p);  %# roll coins to pick with prob p 
data(~index, :) = [];   %# keep only selected points 

này kết thúc lên được tương đương với chỉ tạo p*N điểm ngẫu nhiên ở nơi đầu tiên (ít nhất bạn tiếp cận con số này như N phát triển lớn hơn) ...

data = rand(p*N, 2);   %# directly generate p*N number of points 


bạn có thể kiểm tra rằng tuyên bố cuối cùng cho các giá trị khác nhau của N:

fprintf('1st = %d \n', p*N) 
fprintf('2nd = %d \n', sum(rand(N,1) <= p)) 
+0

thankx rất nhiều, tôi cũng cần những điểm k đã chọn, như u đã nói với dữ liệu (~ index,:) = []; thankx để được giúp đỡ – gurwinder

+0

nếu chúng ta phải tìm khoảng cách giữa bất kỳ điểm dữ liệu nào = rand (N, 2) (nói trước) từ bất kỳ điểm dữ liệu nào (~ index, :) = []; (cũng nói trước điều này), cách chúng ta có thể sử dụng dữ liệu (~ index, :) = []; ma trận trong tuyên bố sau đây? dist = sqrt ((dữ liệu (1,1) -data (~ index, 1))^2+ (dữ liệu (1,2) -data (~ index, 2))^2). câu hỏi của tôi là khi chúng tôi lấy phần tử dữ liệu đầu tiên dưới dạng dữ liệu (1,1) và dữ liệu (1,2). làm cách nào để lấy phần tử dữ liệu đầu tiên (chỉ số ~, ma trận :)? – gurwinder

+0

Tôi không chắc chắn tôi hiểu câu hỏi, nhưng biết rằng 'dữ liệu (~ index,:) = []' chỉ đơn giản là loại bỏ tất cả các yếu tố không được chọn. Vì vậy, nếu bạn dự định sử dụng cả hai điểm đã chọn và không được chọn, bạn NÊN loại bỏ chúng, thay vào đó bạn có thể lưu trữ chúng trong hai ma trận khác nhau: 'selected = data (index, :);' and 'not_selected = data (~ index, :); '. Sau đó, nếu bạn muốn tính toán khoảng cách giữa hai điểm 'i' và' j' mỗi từ một bộ, hãy sử dụng: 'dist_ij = sqrt (sum ((được chọn (i,:) - not_selected (j,:)).^2)); ' – Amro

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