C++ 使用向量的向量的N维矩阵类

C++ 使用向量的向量的N维矩阵类,c++,matrix,linear-algebra,n-dimensional,C++,Matrix,Linear Algebra,N Dimensional,我试图实现一个自定义类,该类使用向量向量处理n维矩阵,概括1d、2d和3d定义: using mat1dd = std::vector<double>; using mat2dd = std::vector<mat1dd>; using mat3dd = std::vector<mat2dd>; 使用mat1dd=std::vector; 使用mat2dd=std::vector; 使用mat3dd=std::vector; 下面是我实现这个类的尝试 模板

我试图实现一个自定义类,该类使用向量向量处理n维矩阵,概括1d、2d和3d定义:

using mat1dd = std::vector<double>;
using mat2dd = std::vector<mat1dd>;
using mat3dd = std::vector<mat2dd>;
使用mat1dd=std::vector;
使用mat2dd=std::vector;
使用mat3dd=std::vector;
下面是我实现这个类的尝试

模板
类图{
std::向量矩阵;
...
}
我的意图是,比如说,

matnd-mat;
创建三维双精度矩阵


上面的递归定义显然失败了,因为它没有基本情况,所以
N_DIM
只是无限期地减少(直到编译器停止)。如何实现该类而不遇到此问题?

使用包含类型定义的模板结构将其专门化为
n=1

template<size_t n, typename T>
struct matnd_helper
{
    using type = std::vector<typename matnd_helper<n - 1, T>::type>;
};

template<typename T>
struct matnd_helper<1, T>
{
    using type = std::vector<T>;
};

template<size_t n, typename T>
using matnd = typename matnd_helper<n, T>::type;

using mat1dd = matnd<1, double>;
using mat2dd = matnd<2, double>;
using mat3dd = matnd<3, double>;


模板
结构匹配辅助程序
{
使用type=std::vector;
};
模板
结构匹配辅助程序
{
使用type=std::vector;
};
模板
使用matnd=typename matnd\u helper::type;
使用mat1dd=matnd;
使用mat2dd=matnd;
使用mat3dd=matnd;

使用包含类型定义的模板结构将其专门化为
n=1

template<size_t n, typename T>
struct matnd_helper
{
    using type = std::vector<typename matnd_helper<n - 1, T>::type>;
};

template<typename T>
struct matnd_helper<1, T>
{
    using type = std::vector<T>;
};

template<size_t n, typename T>
using matnd = typename matnd_helper<n, T>::type;

using mat1dd = matnd<1, double>;
using mat2dd = matnd<2, double>;
using mat3dd = matnd<3, double>;


模板
结构匹配辅助程序
{
使用type=std::vector;
};
模板
结构匹配辅助程序
{
使用type=std::vector;
};
模板
使用matnd=typename matnd\u helper::type;
使用mat1dd=matnd;
使用mat2dd=matnd;
使用mat3dd=matnd;

我建议在引擎盖下使用1D向量。@HolyBlackCat您能详细说明一下您的意思吗?我不明白你的建议。只是
std::vector mat。例如,如果你有一个大小为3x4的2D矩阵,那么向量的大小将是3*4=12。@HolyBlackCat噢,我现在明白你的意思了。这会不会让一些操作变得有点复杂?不会。你只需要写一个to函数就可以将N维坐标转换成向量中的一个位置,其他的都一样。我建议在引擎盖下使用1D向量。@HolyBlackCat你能详细说明一下你的意思吗?我不明白你的建议。只是
std::vector mat。例如,如果你有一个大小为3x4的2D矩阵,那么向量的大小将是3*4=12。@HolyBlackCat噢,我现在明白你的意思了。这会不会让一些操作变得有点复杂?不会。你只需要写一个to函数,把N维坐标转换成向量中的一个位置,其他的都是一样的,非常有趣的方法。这是否意味着我必须分别实现n=1和n>1?基本上是的,但可能已经存在提供基本情况的功能,例如
template std::vector operator+(const std::vector&v1,const std::vector&v2){std::vector res;for(size_ti=0;I
对于添加任何具有提供二进制+运算符的基类型的矩阵来说已经足够了,因为v1+v2在到达基情况时使用此运算符。非常有趣的方法。这是否意味着我必须分别实现n=1和n>1?基本上是的,但可能已经存在提供基本情况的功能,例如
template std::vector operator+(const std::vector&v1,const std::vector&v2){std::vector res;for(size_ti=0;I
对于添加任何具有提供二进制+运算符的基类型的矩阵已经足够了,因为v1+v2在到达基大小写后使用此运算符。