【问题标题】:N-dimensional matrix class using vectors of vectors使用向量的向量的 N 维矩阵类
【发布时间】:2021-02-07 10:38:28
【问题描述】:

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

using mat1dd = std::vector<double>;
using mat2dd = std::vector<mat1dd>;
using mat3dd = std::vector<mat2dd>;

这是我实现这个类的尝试。

template <std::size_t N_DIM, typename T>
class matnd {
    std::vector<matnd<N_DIM - 1, T>> mat;
    ...
}

我的意图是,例如,

matnd<3, double> mat;

创建一个双精度的 3 维矩阵。

上面的递归定义显然失败了,因为它没有基本情况,所以N_DIM 只是无限地减少(直到编译器停止)。我怎样才能以不会遇到此问题的方式实现此类?

【问题讨论】:

  • 我建议在引擎盖下使用一维向量。
  • @HolyBlackCat 您能否详细说明您的意思?我不明白你的建议。
  • 只是std::vector&lt;T&gt; mat;。例如。如果您有一个大小为 3x4 的二维矩阵,则向量的大小为 3*4=12。
  • @HolyBlackCat 哦,我现在了解你了。这不会使一些操作变得有点复杂吗?
  • 不。您只需要编写一个函数来将 N 维坐标转换为此类向量中的位置,其他一切都相同。

标签: c++ matrix linear-algebra n-dimensional


【解决方案1】:

使用包含类型定义的模板结构将其专门用于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>;


【讨论】:

  • 非常有趣的方法。但是,这是否意味着我必须分别实现 n = 1 和 n > 1?
  • 基本上是的,但可能已经存在提供基本情况的功能,例如template&lt;typename T&gt; std::vector&lt;T&gt; operator+(const std::vector&lt;T&gt;&amp; v1, const std::vector&lt;T&gt;&amp; v2) { std::vector&lt;T&gt; res; for (size_t i = 0; i &lt; v1.size(); ++i) { res.push_back(v1[i] + v2[i]); } return res; } 已经足以添加具有提供二元 + 运算符的基本类型的任何矩阵,因为一旦达到基本情况,v1 + v2 就会使用此运算符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-29
  • 2020-10-29
相关资源
最近更新 更多