Геометрический случайный граф в круге
Я хотел создать набор координат, равномерно распределенных случайным образом в шаре радиуса R. Есть ли способ сделать это в Matlab без циклов for, в форме матрицы?
Спасибо
ОБНОВЛЕНИЕ: я извиняюсь за путаницу. Мне нужно только случайным образом генерировать n точек равномерно по окружности радиуса R, а не по сфере.
4 ответа
Правильный ответ здесь http://mathworld.wolfram.com/DiskPointPicking.html. Распределение известно как "Выбор точки диска"
Для полноты картины приведу код 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
(т. е. отношение объема единичного куба к единичной сфере), тогда можно приблизиться к количеству желаемых точек в сфере. Однако, поскольку мы имеем дело с (псевдо) случайными числами в конце концов, мы никогда не можем быть абсолютно уверены, что мы будем генерировать достаточно точек, которые попадают в сферу.
Короче говоря, если вы хотите набрать определенное количество баллов, я бы попробовал одно из других предложенных решений. В противном случае решение для точечного отбора будет хорошим и простым.
Я собирался отметить это как дубликат предыдущего вопроса о генерации равномерного распределения точек в сфере, но я думаю, что вы заслуживаете здесь сомнений, так как, хотя в этом вопросе есть сценарий 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);
Чтобы узнать, почему вы не можете просто использовать единую случайную переменную для всех трех координат, так как можно подумать, что это правильный путь, прочитайте эту статью.
Не уверен, правильно ли я понимаю ваш вопрос, но разве вы не можете просто сгенерировать случайное число внутри сферы, задав φ, θ и r, назначенные случайным числам?