特定のタスクを実行するバリアント関数を構築する際に問題があります。私の特定の例では、私は2x2行列を使用していますが、私の問題は多くのデータ型に一般化していると想像することができます。また、私の例では、「目」は2x2単位行列です。Kroneckerプロダクト用Variadic関数
[OK]を、私は、その入力(3例を与えるために)かもしれない可変引数関数f構築したい:
f(Y, 2, Z, 5, X, 3)
f(X, 4)
f(X, 2, Y, 1)
X、Y、Zは行列であり、数字は正のint値です。それは、それぞれ、以下の疑似コードのクロネッカーの製品を返す必要があります:
KroneckerProduct(eye, Y, X, eye, Z)
KroneckerProduct(eye, eye, eye, X)
KroneckerProduct(Y, X)
だから、本質的にそれが行列を次のint型で指定されたクロネッカー積内の位置に行列を適用し、その間に単位行列で埋めます。
私は多変量関数に慣れていないため、これほど遠くはありませんでした。私の最大の問題は、(最後のコメントを参照してください)私は必要なものを行うには可変引数関数の「再帰的」段階を得ている:
template<typename M, typename I, typename... Args>
arma::mat f(M matrix, I position, Args... args)
{
std::vector<arma::mat> matrixList;
while(position > matrixList.size())
{
matrixList.push_back(eye<arma::mat>(2,2));
}
matrixList(position-1) = matrix;
//Up until here, it's satisfied the first pair of arguments.
//However, if I call f(args...) now, it'll just re-initialize matrixList
}
は私が欠けている回避策はありますか?
それはまさに「正常な」再帰関数と同じ回避策です:) – Rakete1111
あなたはmatrixListを宣言した後のものは、別の関数g(STD ::ベクトル&matrixList、引数に置くべきであることを示唆しています... )、g内で再帰を行いますか?限り、私はvariadicテンプレートを理解する限り、gはargsに先行する引数が1つしかないので、引数は一度に1つずつ展開されませんか?私は割り当てを意味のあるものにするために、一度に2つを解凍しておく必要があります。 –
user2520385