2017-07-14 281 views
0

我有一个像这样的轨迹:我们假设每个红色星形标记都可以将其坐标广播到距离其自己位置5个半径范围内的绿色圆圈标记。在matlab中选择一个特定半径内的n个点的列表?

enter image description here

我怎样才能根据上面的说明选择,每个绿色标记的n个红点列表。提前致谢。

这是我的代码,我提到了红色点和绿色标记的坐标。

%% Network Setup 
anchor_num=1; % Number of anchor node 
node_num=20; % Total nodes 
length1=70; % Area length 
anchor_x=0; % Intial position of anchor x coordinate 
anchor_y=0; % Intial position of anchor y coordinate 
anchormove=[];% Anchor trajectory 
width=40; % Area width 
r = 30;  
A = zeros(0,2); 
B = zeros(0,2); 
C = zeros(0,2); 
D = zeros(0,2); 
north = [ 0 6.9]; 
east = [ 6.9 0]; 
south = [ 0 -6.9]; 
west = [-6.9 0]; 
order = 4; 
for n = 1:order 
    AA = [B ; north ; A ; east ; A ; south ; C]; 
    BB = [A ; east ; B ; north ; B ; west ; D]; 
    CC = [D ; west ; C ; south ; C ; east ; A]; 
    DD = [C ; south ; D ; west ; D ; north ; B]; 
    A = AA; 
    B = BB; 
    C = CC; 
    D = DD; 
end 
% Plot network trajectory 
%Mtrix A contains the coordinate of red markers. 
A = [0 0; cumsum(A)] 
p=plot(A(:,1),A(:,2)) 
title('Plot of Hilbert trajectory'); 
set(p,'Color','magenta ','LineWidth',2); 
axis([0 100 0 100]); 
hold on 
% x and y are the coordinates of green markers 
x=rand(1,100)*100; 
y=rand(1,100)*100; 
scatter(x,y) 

anchormove(1,:)=A(:,1)' 
anchormove(2,:)=A(:,2)' 
idx=length(anchormove(1,:)); 
for i=1:idx-1 
    % Plot the moving anchor node 
    Ax=anchormove(1,i); 
    Ay=anchormove(2,i); 
    plot(Ax,Ay,'r*'); 
% Plot transmission range of the anchor node 
    axis([0 100 0 100]) 
    % hold on 
    pause(0.1) 
    %hold off 
end 

回答

0

您可以使用rangesearch(X,Y,radius)。它返回一个单元格数组,其中单元格包含对于每个点Y的给定radius内的点X的索引。由于每个Y附近点的数量可能会有所不同,因此每个单元的索引数量可能会有所不同。

所以你的情况:

% turn the two x and y vectors into [x y] column format. 
GreenPoints = [x;y].'; 
% get indexes of the points A for each Green point within 5 distance 
idx = rangesearch(A,GreenPoints,5); 

或更短:

idx = rangesearch(A,[x;y].',5); 
1

如果你没有,你可以自己动手完成这样的统计和机器学习工具箱。要查找所有的“红色”点(从您的代码似乎它们包含在A)的范围内R从特定绿点(x(i)y(i)),你可以使用

w = sqrt(sum((A - [x(i),y(i)]).^2,2)) <= R; 

,如果你有Matlab的> = R2016,否则

w = sqrt(sum((A - repmat([x(i),y(i)],size(A,1),1)).^2,2)) <= R; 

然后,w是内的[x(i),y(i)]范围R包含所有锚点逻辑1的逻辑阵列。您可以使用逻辑索引àlaA(w,:)来检索它们。例如,plot(A(w,1),A(w,2),'ks')会用不同的标记来绘制它们。

如果你需要为你的所有的绿色点做这个共同的代码变得

W = sqrt(sum(abs((reshape(A,size(A,1),1,2) - reshape([x;y]',1,length(x),2)).^2),3)) <= R; 

Matlab的> = R2016。现在,W是一个矩阵,其行是红色点,列是绿色标记,如果一对在半径R内,则包含逻辑1,否则为0。例如,您可以使用any(W,2)来检查红点是否在任何绿色标记的范围内。

MATLAB的R2016之前,你需要修改上面的一些repmat魔术:

W = sqrt(sum(abs((repmat(reshape(A,size(A,1),1,2),1,length(x),1) - repmat(reshape([x;y]',1,length(x),2),size(A,1),1,1)).^2),3)) <= R;