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

标签 c++ variadic-templates variadic-functions

我在构建执行特定任务的可变参数函数时遇到问题。对于我的特定示例,我使用的是 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/

相关文章:

c++ - 删除copy-ctor和copy-assignment - public、private还是protected?

在 C 中的可变参数函数下调用 sprintf()

c++ - 使用折叠表达式初始化静态 constexpr 类数据成员不编译

c++ - 如何使用模板创建多维 std::array?

c++ - 如何实现可变参数模式以将可变数量的参数转发给 C++11 中的函数?

c++ - 可变函数导致带有枚举的 SIGILL 信号

c++ - c++中 vector 的clear()和erase()方法之间的区别?

c++ - boost::multi_array 调整大小异常?

c++ - 如何将 2 个 16 位 vector 相乘并将结果存储在 sse 中的 32 位 vector 中?

c++ - 从 C++ 模板参数包编译时间数组