私はn
次元配列T
を持っています。各次元の長さは同じです。L
です。この配列は1Dベクトルv
(T
の「再構成」バージョンと見なすことができるので、v
の長さはL^n
です)によって表されます。ネストされたループ:ベクトルで表されるn次元配列を置換する
次の例では、v
がT
(どこn = 3
とL = 4
)の指標に応じてインデックスされる方法を示しています。
(例えばT(0,3,2) = v[14]
)
私がやりたいどのようなことでありn
次元配列S
を表すベクトルu
を作成します。ここで、S
は、/ rotati nはT
で1、すなわち
T(i1,i2,...,in) = S(i2,i3,...,in,i1)
のいずれかの場合は(i1,i2,...,in)
です。
(T
がマトリックスである場合、S
は、T
の転置に対応する)。
更新:
次のコードは、より良い私の質問を説明することがあります。
void permute(vector<double> &output, const vector<double> &v, int L)
{
int n = log(v.size())/log(L);
// Suppose that we have a function doing this
narray T = get_narray_from_vector(v, L);
// Get the permutation of T
narray S(T.size());
for(int i1 = 0; i1 < L; i1++){
for(int i2 = 0; i2 < L; i2++){
...
for(int in = 0; in < L; in++){
S(i2,i3,...,in,i1) = T(i1,i2,...,in);
}
}
}
// get vector from narray
output.resize(v.size());
int idx = 0;
for(int i1 = 0; i1 < L; i1++){
for(int i2 = 0; i2 < L; i2++){
...
for(int in = 0; in < L; in++){
output[idx] = S(i1,i2,...,in);
idx++;
}
}
}
}
は、実際には、しかし、私はそれがはるかに優れたベクターで直接作業していると思います。したがって、私はこのようなものだろう:
void permute(vector<double> &output, const vector<double> &v, int L)
{
int n = log(v.size())/log(L);
output.resize(v.size());
// Get the permutation
for(int i1 = 0; i1 < L; i1++){
for(int i2 = 0; i2 < L; i2++){
...
for(int in = 0; in < L; in++){
output[i2*pow(L, n-1) + i3*pow(L, n-2) + ... + in*L + i1] = v[i1*pow(L, n-1) + i2*pow(L, n-2) + ... + i_{n-1}*L + in];
}
}
}
}
ここに難しさをn
がパラメータであるため、ネストされたループです。
どうすればいいですか? ご協力いただきありがとうございます!
あなたの質問は本当に明確ではありません。あなたは何を試みましたか? 'i1'、' i2'などが "列"を表していると仮定した場合、最初の列を削除し、他の列をすべてシャッフルしてから、最初の列を最後に追加しますか? (注:多次元配列の文脈では、 "転置"という言葉は、あなたがその言葉を使用しているものとは異なるような特別な意味を持っています)。 – Peter
Tをこのようにベクトルに格納する必要はありますか?私の最初の傾向は、 "配列の配列"をn次元に拡張して格納することです。次に、トップレベルの配列を1つのインデックスだけシフトする必要があると思うものは何でしょうか? – Nic
また、たとえば、L = 3であると言うと、各次元の長さは4(0,1,2,3)です。 – Nic