【问题标题】:Get submatrix of matrix with smaller size获取尺寸较小的矩阵的子矩阵
【发布时间】:2012-06-27 07:51:28
【问题描述】:

我使用来自 stl 的 bitset 或来自 boost 的 dynamic_bitset 用位表示地图(矩阵行 x 列)(我可以使用任何我想要的东西)。我需要获得该矩阵的较小尺寸的子矩阵(例如 a(2,2) a(2,3) a(3,2) a(3,3) 大小为 2 )。是否有任何有效的结构可以用位表示矩阵并从 startindex 和 length 获取子矩阵而无需迭代?

【问题讨论】:

  • 与 Boost range 和 slice 的概念相同。不确定具体实施。

标签: c++ algorithm boost stl


【解决方案1】:

可以在矩阵和子矩阵之间有效地共享数据。诀窍是跟踪类中的三个变量。

  • row_stride
  • 开始
  • 数据

data 必须是类似shared_ptr 的结构,以便在完成后可以销毁基础数据。 start 将是指向data 引用的数据的指针,row_stride 告诉您要移动多远才能到达下一行。

您可能想要跟踪的其他内容是

  • 列步长(这可以让您将其他有趣的视图带入矩阵,并有效地支持转置)。
  • 行和列的长度 - 这些对于调试或如果您想使您的循环和乘法更易于使用时非常方便。

这是一种非基于位的方法的外观(我省略了很多......但希望你明白要点)。

template<typename T>
struct MatrixData
{
   T * data;
   explicit MatrixData( size_t N ) { new T[N]; }
   ~MatrixData() { delete [] data; }
private:
    MatrixData( const MatrixData & );
    MatrixData& operator=( const MatrixData & );
};

template<typename T>
class Matrix
{
    Matrix(size_t nni, size_t nnj) :
      data( new MatrixData( nni*nnj ) ),
      ni(nni),
      nj(nnj),
      row_stride(ni),
      col_stride(1)
    {
    }

    T operator()( size_t i, size_t j)
    {
       assert( i < ni );
       assert( j < nj );
       return start + i * col_stride + j * row_stride;
    }

    Matrix submatrix( size_t i_start, size_t j_start, size_t new_ni, size_t new_nj )
    {
       assert( i_start + new_ni < ni );
       assert( j_start + new_nj < nj );

       Matrix retval(*this);
       retval.start += i_start * col_stride + j_start * row_stride;
       retval.ni = new_ni;
       retval.nj = new_nj;
       return retval;
    }

    Matrix transpose()
    {
       Matrix retval(*this);
       std::swap(retval.ni,retval.nj);
       std::swap(retval.row_stride,retval.col_stride);
    }

  private:
    shared_ptr<MatrixData> data;
    T* start;
    size_t ni;
    size_t nj;
    size_t row_stride;
    size_t col_stride;

};

使这项工作适用于基于位的版本意味着更改MatrixData 以保存基于机器人的结构之一,将start 更改为结构的索引,并更改您的operator() 以正确访问数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    相关资源
    最近更新 更多