【发布时间】:2019-03-12 01:23:22
【问题描述】:
我使用Intel MKL 将我的大型稀疏对称矩阵存储为压缩稀疏行 (CSR)。例如,假设我的对称稀疏矩阵是5x5:
A =
1 -1 0 -3 0
-1 5 0 0 0
0 0 4 6 4
-3 0 6 7 0
0 0 4 0 -5
values = {1, -1, -3, 5, 4, 6, 4, 7, -5}; // symmetric sparse matrix
columns = {0, 1, 3, 1, 2, 3, 4, 3, 4}; // zero-based
rowIndex = {0, 3, 4, 7, 8, 9}; // zero-based
我正在尝试在给定行和列的情况下找到A 的子矩阵,例如A(1:3, 2:4):
A(1:3,2:4) =
0 0 0
4 6 4
6 7 0
values = {4, 6, 4, 6, 7}; // General sparse matrix (sub-matrix is not necessarily symmetric)
columns = {0, 1, 2, 0, 1}; // zero-based
rowIndex = {0, 0, 3, 5}; // zero-based
如果知道如何进行矩阵索引,我将不胜感激。我能想到的一种方法是将CSR 转换为坐标格式COO 并应用矩阵索引,然后将其转换回CSR,我认为这不是一种有效的方法。
有人可以告诉我一种有效或常用的稀疏矩阵索引方法吗?
【问题讨论】:
-
您似乎知道这一点,但重要的是要注意结果通常不是对称的(当然,当它保持对称时很容易注意到)。
-
如果你有一个完整的矩阵存储为 CSR,它应该很容易。在这里,您必须重建(显式或隐式)缺失的部分。我的第一个猜测是它应该类似于 CSR CSC 格式转换,我建议你看看那个算法(github.com/scipy/scipy/blob/…)。
标签: c++ matrix indexing sparse-matrix intel-mkl