gpt4 book ai didi

c++ - Kronecker 积的可变参数函数

转载 作者:行者123 更新时间:2023-11-28 00:00:02 26 4
gpt4 key购买 nike

我在构建执行特定任务的可变参数函数时遇到问题。对于我的特定示例,我使用的是 2x2 矩阵,但您可以想象我的问题可以推广到许多数据类型。此外,对于我的示例,“眼睛”是 2x2 单位矩阵。

好的,所以我想构造一个可变参数函数 f,其输入可能是(举 3 个例子):

f(Y, 2, Z, 5, X, 3)
f(X, 4)
f(X, 2, Y, 1)

其中 X、Y、Z 是矩阵,数字是正整数。它应该分别返回以下伪代码 kronecker 产品:

KroneckerProduct(eye, Y, X, eye, Z)

KroneckerProduct(eye, eye, eye, X)

KroneckerProduct(Y, X)

所以本质上它在 KroneckerProduct 中由矩阵后面的 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
}

是否有我缺少的解决方法?

最佳答案

我不知道你将如何计算返回值(我还不懂那种数学),但如果你从最后的 matrixList 计算它,您可以围绕函数做一个包装器:

template<typename... Args>
arma::mat calculateSomething(Args&&... args) {
std::vector<arma::mat> list;
f(list, std::forward<Args...>(args...)); //First argument for recursion

//Calculate return value
return return_value;
};

f看起来像这样:

//Default case with just 1 argument
void f(std::vector<arma::mat>&) {}

template<typename M, typename I, typename... Ts>
void f(std::vector<arma::mat>& matrixList, M matrix, I position, Ts... args)
{
while(position > matrixList.size())
{
matrixList.push_back(eye<arma::mat>(2,2));
}

//This is not valid syntax, no idea what you are trying to do here
//matrixList(position-1) = matrix;

//recursive call
f(matrixList, args...);
}

关于c++ - Kronecker 积的可变参数函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39858187/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com