геометрический случайный граф в круге - PullRequest
1 голос
/ 12 апреля 2011

Я хотел сгенерировать набор координат, равномерно распределенных случайным образом в шаре радиуса R. Есть ли способ сделать это в Matlab без циклов for, в форме матрицы?

Спасибо

UPDATE: Я прошу прощения за путаницу. Мне нужно только случайным образом генерировать n точек равномерно по окружности радиуса R, а не по сфере.

Ответы [ 4 ]

3 голосов
/ 12 апреля 2011

правильный ответ здесь http://mathworld.wolfram.com/DiskPointPicking.html. Распределение известно как «Выбор диска»

1 голос
/ 12 апреля 2011

Я собирался пометить это как дубликат предыдущего вопроса по , генерирующего равномерное распределение точек в сфере , но я думаю, что вы заслуживаете здесь сомнений, как будто есть сценарий matlab ввопрос, большая часть этой темы - Python.

Эта маленькая функция, приведенная в вопросе (и я вставляю ее непосредственно оттуда), - это то, что вам нужно.

function X = randsphere(m,n,r)

% This function returns an m by n array, X, in which 
% each of the m rows has the n Cartesian coordinates 
% of a random point uniformly-distributed over the 
% interior of an n-dimensional hypersphere with 
% radius r and center at the origin.  The function 
% 'randn' is initially used to generate m sets of n 
% random variables with independent multivariate 
% normal distribution, with mean 0 and variance 1.
% Then the incomplete gamma function, 'gammainc', 
% is used to map these points radially to fit in the 
% hypersphere of finite radius r with a uniform % spatial distribution.
% Roger Stafford - 12/23/05

X = randn(m,n);
s2 = sum(X.^2,2);
X = X.*repmat(r*(gammainc(s2/2,n/2).^(1/n))./sqrt(s2),1,n);

Чтобы понять, почему вы не можете просто использовать единый случайныйпеременная для всех трех координат, так как одна может думать правильным образом, дать этой статье прочтение .

1 голос
/ 12 апреля 2011

Для полноты картины приведу код MATLAB для точечного отбора. Он генерирует набор случайных точек в единичном кубе, удаляет точки, находящиеся за пределами единичной сферы, и масштабирует координаты вверх, чтобы заполнить сферу радиуса R:

XYZ = rand(1000,3)-0.5;           %# 1000 random 3-D coordinates
index = (sum(XYZ.^2,2) <= 0.25);  %# Find the points inside the unit sphere
XYZ = 2*R.*XYZ(index,:);          %# Remove points and scale the coordinates

Одним из ключевых недостатков этого метода отбора точек является то, что он затрудняет создание определенного количества точек. Например, если вы хотите создать 1000 точек внутри своей сферы, сколько вам нужно создать в кубе, прежде чем отбирать их? Если вы увеличите число точек, сгенерированных в кубе, в 6/pi раз (т.е. отношение объема единичного куба к единичной сфере), тогда вы сможете приблизиться к количеству желаемых точек в сфере. , Тем не менее, поскольку мы имеем дело с (псевдо) случайными числами, в конце концов, мы никогда не можем быть абсолютно уверены, что будем генерировать достаточное количество точек, попадающих в сферу.

Короче говоря, если вы хотите сгенерировать конкретное количество точек, я бы попробовал одно из других предложенных решений. В противном случае решение для точечного отбора будет хорошим и простым.

0 голосов
/ 12 апреля 2011

Не уверен, правильно ли я понимаю ваш вопрос, но разве вы не можете просто сгенерировать случайное число внутри сферы, задав φ, θ и r, присвоенные случайным числам?

...