如何在MATLAB中从N个点中随机选择k个点?

12

我使用这段代码来创建并绘制N个点:

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

我如何从 N 个点中选择 k 个点,并以概率 p=0.25 对这些 k 个点进行染色,将其变为红色,其他点保持原样,用 * 表示。


1
你最后的陈述有矛盾。你是想从N个值中随机选择k个值,还是想从长度为N且概率为p的向量中随机选择值?这两种方法可能会产生不同的结果。 - gnovice
2个回答

29

有两种方法可以选择。第一种解决方案是从N个值中随机选择k个值,这将确保您始终选择k个点。第二种解决方案是随机选择每个值,每个值被选中的平均概率为p,这可能导致随机选择的点数量少至0或多至N

  • N个值中选择k个:

    您可以使用RANDPERM函数创建整数1N的随机排列,然后选择排列列表中的前k个值并重新绘制为红色:

index = randperm(N);
plot(x(index(1:k)),y(index(1:k)),'r*');
  • 使用平均概率 p 选择值:

    你可以使用RAND函数从01中随机选取一个值,对于你的N个数中的每一个都这样做,然后选择那些随机值小于等于你的平均概率p的数,并将它们重新绘制为红色:

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

    或者对于第一种情况使用randsample函数。 - chaohuang

    3
    据我所理解,对于每个 N 个随机点,您想要抛硬币来决定是否选择它(其中硬币的成功概率为 p=0.25!)
    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
    

    这最终等同于在一开始仅生成p*N个随机点(当N变得更大时,你至少接近这个数字)...
    data = rand(p*N, 2);          %# directly generate p*N number of points
    

    你可以针对不同的N值来测试最后一个语句:
    fprintf('1st = %d \n', p*N)
    fprintf('2nd = %d \n', sum(rand(N,1) <= p))
    

    非常感谢,我也需要那些被选中的点,就像你说的那样,data(〜index,:)= [];感谢您的帮助。 - gurwinder
    如果我们需要找到数据=rand(N,2)中任何一点(比如第一个)和数据(index,:)中任何一点(比如第一个)之间的距离,我们应该如何在下面的语句中使用data(index,:)矩阵?dist=sqrt((data(1,1)-data(index,1))^2+(data(1,2)-data(index,2))^2).我的问题是,由于我们将data(1,1)和data(1,2)作为data的第一个元素,那么我们应该如何获取data(~index,:)矩阵的第一个元素? - gurwinder
    我不太确定我理解问题,但是知道 data(~index,:)=[] 只是删除未选择的所有元素。因此,如果您计划同时使用选定和未选定的点,则不应将它们删除,而是可以将它们存储在两个不同的矩阵中:selected = data(index,:);not_selected = data(~index,:);。然后,如果您想要计算来自一个集合的两个点 ij 之间的距离,请使用:dist_ij = sqrt(sum((selected(i,:)-not_selected(j,:)).^2)); - Amro
    谢谢你,我的朋友。由于你没有在这里回复,所以我又发了一个问题。我可以把那个问题从留言板上删除吗?还是让它保留在那里?不管怎样,再次感谢。 - gurwinder
    @amro 选择的是 data(index,:),但是出现了以下错误:??? 索引超出矩阵维度。 - gurwinder

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接