静的多次元配列縮小フレームワークで作業していますが、説明するのがやや難しい問題が発生しましたが、私はベストを尽くします。私たちは今、私たちは、私は今、その署名すべき機能contraction
を持ってIndices
別のvariadicパラメータパックに基づいてvariadicパックの収縮を見つける
template<int ... Idx>
struct Indices {}
と呼ばれる別のクラスを持っている
Array<double> scalar;
Array<double,4> vector_of_4s;
Array<float,2,3> matrix_of_2_by_3;
// and so on
としてインスタンス化することができ
template<typename T, int ... dims>
class Array {}
N
次元配列のクラスがあるとし次のようになります
template<T, int ... Dims, int ... Idx,
typename std::enable_if<sizeof...(Dims)==sizeof...(Idx),bool>::type=0>
Array<T,apply_to_dims<Dims...,do_contract<Idx...>>>
contraction(const Indices<Idx...> &idx, const Array<T,Dims...> &a)
私はここで構文を取得していないかもしれませんが、返されたArray
は、Indices
というエントリに基づいたディメンションを持っています。 contraction
が実行できるものの例を挙げておきます。このコンテキストでは、縮小を意味します。インデックスリスト内のパラメータが等しいの次元が削除されていることに注意してください。
auto arr = contraction(Indices<0,0>, Array<double,3,3>)
// arr is Array<double> as both indices contract 0==0
auto arr = contraction(Indices<0,1>, Array<double,3,3>)
// arr is Array<double,3,3> as no contraction happens here, 0!=1
auto arr = contraction(Indices<0,1,0>, Array<double,3,4,3>)
// arr is Array<double,4> as 1st and 3rd indices contract 0==0
auto arr = contraction(Indices<0,1,0,7,7,2>, Array<double,3,4,3,5,5,6>)
// arr is Array<double,4,6> as (1st and 3rd, 0==0) and (4th and 5th, 7==7) indices contract
auto arr = contraction(Indices<10,10,2,3>, Array<double,5,6,4,4>
// should not compile as contraction between 1st and 2nd arguments
// requested but dimensions don't match 5!=6
// The parameters of Indices really do not matter as long as
// we can identify contractions. They are typically expressed as enums, I,J,K...
だから、本質的に、両方とも同じサイズでなければならないIdx...
とDims...
所与、Idx...
の値そのチェックは、それらが発生する位置を取得し、Dims...
に対応するエントリ(位置)を取り外し、等しいです。これは基本的にtensor contraction ruleです。配列収縮の
ルール:
- 指標のパラメータの数や配列の次元/ランクが同じである必要があり、すなわち
sizeof...(Idx)==sizeof...(Dims)
- 一対一があります
Idx
とDims
の場合、つまり、Indices<0,1,2>
とArray<double,4,5,6>
の場合、0
は4
に、1
は5
とにそれぞれ割り当てられますは6
にマップされます。 Idx
に同じ/等しい値がある場合、我々はIndices<0,0,3>
とArray<double,4,4,6>
を有する場合Dims
の対応する寸法は、例えば、消えるべきである意味、収縮を意味し、0==0
及びこれらの値がどのているにマップ対応する寸法例えば、Indices<0,0,3>
とArray<double,4,5,6>
が不可能である、4
と4
両方が消滅する必要があり、Idx
が同じ値を有する場合に得られた配列は、Array<double,6>
- であるべきであるが、対応する
Dims
は、コンパイル時エラーがトリガされるべきであり、一致しません4!=5
と同様に、Indices<0,1,0>
4!=6
とすることはできません。 - 異なる次元の配列では収縮が起こりません。たとえば、
Array<double,4,5,6>
はどのような方法でも収縮することはできません。 - 複数のペア、トリプレット、四つ組など、例えば
Indices<0,0,0,0,1,1,4,3,3,7,7,7>
ため、限りも一致対応Dims
としてIdx
に許可された入力配列がArray<double,2,2,2,2,3,3,6,2,2,3,3,3>
た所与、Array<double,6>
に収縮あろう。
この機能を実現するには、私のメタプログラムの知識はそれほどのものではありませんが、私が正しい方向に私を誘導するという目的を明確にしたかったと思います。
あなたのルールが収縮であるかどうかわかりません。 'Idx ...'と 'Dims ...'が与えられたら、出力の次元はどうなるでしょうか?一連の例ではなく、一連のルールを提供できますか? – md5i
本質的には、 'Idx ...'と 'Dims ...'はどちらも同じサイズで、 'Idx ... 'のどの値が等しいかを確認し、出現する位置を取得し、対応するエントリを削除します'Dims ... 'に。 – romeric
@romeric - 'Idx'や3連符などにも同じ値のカップルだけを持つことができますか?トリプレットの場合、ルールは何ですか? – max66