具有静态维度的“特征”矩阵

计算科学 C++ 本征
2021-12-03 23:42:40

我注意到具有动态维度的“特征”矩阵比具有静态维度的矩阵效率低。我的算法使用了很多不需要调整大小的矩阵,所以我想使用静态维度,但是事先不知道维度,这不起作用:

const size_t n = 3;
Eigen::Matrix<double, n, n> A;

有解决方法吗?也许用宏?(我不精通 C/C++,我还不知道宏,如果我的问题很愚蠢,对不起)。

1个回答

不,在一般情况下,没有合适的解决方法。C++ 是一种静态类型语言,编译器需要在编译时知道所有类型。如果您的代码有效,则以下内容也将

const size_t n = std::rand();
Eigen::Matrix<double, n, n> A;

并且rand()只在运行时给出一个随机数,在编译时是未知的。

此外,我不会过分依赖固定大小的矩阵比动态矩阵更快地执行代码的说法。有优化效果,但只为小维度付费。Eigen 帮助页面指出它应该用于“通常高达 4x4,有时高达 16x16”,但不适用于更大的矩阵。

以下是特殊情况的可能性:

  • static constconstexpr告诉编译器该变量编译时表达式。您可以将其用作占位符,这样可以避免重复输入幻数:

    static constexpr size_t n = 3;
    Eigen::Matrix<double, n, n> A;
    Eigen::Matrix<double, n, n> B;
    

    但是您仍然不能将其用于动态数字。

  • 您能做的最好的事情就是将您的维度归结为一些特殊情况。假设您要针对尺寸进行优化n=2,3,4然后你可以将你的计算包装成一个大函数模板calculate<n>,让编译器显式实例化少数特殊情况,例如通过

    if(n==2)
    {
        calculate<2>();
    }
    else if(n==3)
    {
        calculate<3>();
    }
    ...
    

    (有更聪明的技术,但这个“if-loop”完美地给出了这个想法)

    这样,您将编译时间增加了与特殊情况数量相对应的因子,但运行时可能会更快。然后,您可以n至少从所选范围中动态选择。

    如果您对这项技术进一步感兴趣,请告诉我。