n 次元の n キューブを表す点群の座標を表すデータを生成したいと考えています。これらのポイントは、n 空間全体に均等に分散され、ユーザー定義の間隔で生成できる必要があります。このデータは配列に格納されます。
3 に答える
Boost.MPLを使用したデカルト積の実装を見つけました。
Boostにも実際のデカルト積がありますが、これはプリプロセッサディレクティブであり、役に立たないと思います。
簡単にするために、通常の立方体、つまり 3 次元の立方体の例を次に示します。辺の長さを 1 とし、1/n の間隔でポイントを配置するとします。(これは点の均一な長方形の分布につながりますが、これがあなたが望むものであるかどうかは完全にはわかりません)。
いくつかの擬似コード:
for i=0;i<=n;i++ //NB i<=n because there will be n+1 points along each axis-parallel line
for j=0;j<=n;j++
for k=0;k<=n;k++
addPointAt(i/n,j/n,k/n) //float arithmetic required here
これは何かのデカルト積ではなく、あなたの基準 (の特殊なケース) を満たすように見えることに注意してください。ポイントの間隔を変える場合は、ループの開始インデックスと終了インデックス、または間隔サイズを調整します。
これを特定の高次元に一般化するのは簡単で、ループを追加します。
実行時までわからない高次元に一般化することは、ほんのわずかに困難です。N 次元配列を宣言する代わりに、同じ要素数で 1 次元配列を宣言します。次に、コンパイラーに作成させる代わりに、インデックス演算を明示的に作成する必要があります。
これはあなたが望んでいるものではないことをあなたが今私に言うつもりだと思います! そうでない場合は、明確にすることができます。
これを再帰的に行うことができます(疑似コード):
Function Hypercube(int dimensions, int current, string partialCoords)
{
for i=0, i<=steps, i++
{
if(current==dimensions)
print partialCoords + ", " + i + ")/n";
else if current==0
Hypercube(dimensions, current+1, "( "+i);
else
Hypercube(dimensions, current+1, partialCoords+", "+i);
}
}
あなたはそれを呼びます: Hypercube(n,0,""); これにより、すべてのポイントの座標が出力されますが、それらを構造体に保存することもできます。