【发布时间】:2015-10-25 12:00:30
【问题描述】:
以“坐标格式”获得右下四分之一稀疏矩阵的最佳方法是什么?我需要它作为 Schur 补码。
坐标从 1 开始索引(我使用的是 MUMPS)。
示例:
int order_of_matrix = 4
int row_coords[] = {1,1,2,3,3,4};
int col_coords[] = {1,3,3,3,4,4};
int vals[] = {1,2,3,4,5,6};
所以我的矩阵应该是这样的:
|1 0 2 0|
|0 0 3 0|
|0 0 4 5|
|0 0 0 6|
现在,我需要像这样从右下角获取值:
int schur_complement_size = 1
|6|
int schur_complement_size = 2
|4 5|
|0 6|
int schur_complement_size = 3
|0 3 0|
|0 4 5|
|0 0 6|
int schur_complement_size = 4
|1 0 2 0|
|0 0 3 0|
|0 0 4 5|
|0 0 0 6|
有没有什么优雅的方法可以在不将矩阵转换为密集格式的情况下实现这一点?密集格式对我来说很成问题,因为我的程序实际使用的矩阵会非常大。
【问题讨论】:
-
我要做的第一件事是创建一个结构,这样您就不必为矩阵的不同部分保留三个大小相等的向量。然后,考虑新矩阵的现有矩阵的哪些部分以及元素的不同之处。最后,选择一种语言,因为答案会有所不同。
-
我必须使用几个数组,这就是我之前在这个项目中使用它的方式。我在标题中插入了“C++”,所以现在更具体了。而且我不明白“考虑”的部分 - 我只是想提取矩阵的“右下”角......
-
索引非零值的行向量和列向量是否保证被排序?如果是这样 - 如何?与蛮力方法相比,这肯定会改变“最优雅”的解决方案,因为您可以进行二进制搜索来找到起点。对于巨大的稀疏矩阵,加速可能很显着。
-
好吧,如果你想避免使用三个不同的、动态分配的向量和随之而来的内存管理负担,那就这样吧。无论如何,从逻辑上讲,无论您如何存储它们,您仍然拥有三倍的行、列和值。我想让您考虑的是如何确定三元组是否是要从中提取的矩阵的一部分。然后,考虑在新矩阵中将使用哪个新三元组。