首页 > 解决方案 > 稀疏矩阵的子矩阵

问题描述

我正在编写一个 C++ 矩阵库(https://github.com/frozenca/Ndim-Matrix)。我计划支持稀疏矩阵。让我头疼的是实现子矩阵运算。

例如,我期望这样的事情:

// (5 0 6 0)
// (0 1 0 2)
// (3 0 4 0)
// (0 7 0 8)
SparseMat<int> m1 {{5,0,6,0},{0,1,0,2},{3,0,4,0},{0,7,0,8}};

// (1 0)
// (0 4)
auto m2 = m1.submatrix({1,1},{3,3}); // non-owning view for m1's internal buffer

m2 *= 2;

// now m is
// (5 0 6 0)
// (0 2 0 2)
// (3 0 8 0)
// (0 7 0 8)

// (1 0)
// (0 2)
// (3 0)
SparseMat<int> m3 {{1, 0}, {0, 2}, {3, 0}};

// (2 0)
// (0 16)
// (6 0)
auto m4 = matmul(m3, m2); // shouldn't copy m1.

对于密集矩阵,我的库将子矩阵实现为具有指向缓冲区和本地步幅的指针的非拥有视图。上面的代码适用于密集矩阵。对于稀疏矩阵,我怎样才能以高性能(即没有元素复制)来模拟它?

标签: c++matrix

解决方案


推荐阅读