半径Rのボール内にランダムに均一に分布する座標のセットを生成したかったのです。行列のような形式で、forループなしでMatlabでこれを行う方法はありますか?
ありがとう
更新:混乱してすみません。球ではなく、半径Rの円上でランダムにn点を均一に生成する必要があるだけです。
正解はここhttp://mathworld.wolfram.com/DiskPointPicking.htmlです。配布は「ディスクポイントピッキング」として知られています
球内の点の均一な分布を生成することに関する前の質問の複製としてこれをマークしようとしていましたが、質問には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);
正しい方法だと思われるかもしれないので、3つの座標すべてに一様確率変数を使用できない理由を知るには、この記事を読んでください。
完全を期すために、ポイントカリングソリューションの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
このポイントカリング方法の主な欠点の1つは、特定の数のポイントを生成することが困難になることです。たとえば、球内に1000ポイントを生成する場合、それらをカリングする前に、キューブ内にいくつ作成する必要がありますか?立方体で生成される点の数を係数6/pi
(つまり、単位球に対する単位立方体の体積の比率)でスケールアップすると、球内の目的の点の数に近づくことができます。ただし、結局のところ、(疑似)乱数を扱っているので、球に含まれる十分なポイントを生成することを絶対に確信することはできません。
つまり、特定の数のポイントを生成したい場合は、提案されている他のソリューションの1つを試してみます。それ以外の場合、ポイントカリングソリューションは素晴らしくシンプルです。
あなたの質問を正しく理解しているかどうかはわかりませんが、乱数に割り当てられたφ、θ、rを設定することで、球の中に乱数を生成することはできませんか?