我注意到具有动态维度的“特征”矩阵比具有静态维度的矩阵效率低。我的算法使用了很多不需要调整大小的矩阵,所以我想使用静态维度,但是事先不知道维度,这不起作用:
const size_t n = 3;
Eigen::Matrix<double, n, n> A;
有解决方法吗?也许用宏?(我不精通 C/C++,我还不知道宏,如果我的问题很愚蠢,对不起)。
我注意到具有动态维度的“特征”矩阵比具有静态维度的矩阵效率低。我的算法使用了很多不需要调整大小的矩阵,所以我想使用静态维度,但是事先不知道维度,这不起作用:
const size_t n = 3;
Eigen::Matrix<double, n, n> A;
有解决方法吗?也许用宏?(我不精通 C/C++,我还不知道宏,如果我的问题很愚蠢,对不起)。
不,在一般情况下,没有合适的解决方法。C++ 是一种静态类型语言,编译器需要在编译时知道所有类型。如果您的代码有效,则以下内容也将
const size_t n = std::rand();
Eigen::Matrix<double, n, n> A;
并且rand()只在运行时给出一个随机数,在编译时是未知的。
此外,我不会过分依赖固定大小的矩阵比动态矩阵更快地执行代码的说法。有优化效果,但只为小维度付费。Eigen 帮助页面指出它应该用于“通常高达 4x4,有时高达 16x16”,但不适用于更大的矩阵。
以下是特殊情况的可能性:
static const并constexpr告诉编译器该变量是编译时表达式。您可以将其用作占位符,这样可以避免重复输入幻数:
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至少从所选范围中动态选择。
如果您对这项技术进一步感兴趣,请告诉我。