使用C计算稀疏矩阵每列的和
我有一个大小为(8 x 8)的矩阵,如下所示,我必须将其转换为稀疏矩阵的形式,并使用C语言计算每列的非零元素之和使用C计算稀疏矩阵每列的和,c,sparse-matrix,C,Sparse Matrix,我有一个大小为(8 x 8)的矩阵,如下所示,我必须将其转换为稀疏矩阵的形式,并使用C语言计算每列的非零元素之和 Matrix = [1 2 0 4 0 0 0 0; 0 1 3 0 2 0 0 0; 1 0 4 7 0 0 0 0; 0 6 0 0 1 8 0 0; 0 0 0 0 4 0 0 0; 0 0 0 0 8 1 1 0;
Matrix = [1 2 0 4 0 0 0 0;
0 1 3 0 2 0 0 0;
1 0 4 7 0 0 0 0;
0 6 0 0 1 8 0 0;
0 0 0 0 4 0 0 0;
0 0 0 0 8 1 1 0;
0 0 0 0 9 0 2 0;
0 0 0 0 0 0 7 1]
有人能就如何处理这个问题提出建议吗?
请注意,这是一个示例矩阵,在实践中,我有大量的尺寸矩阵(15000行x 25000列)
有人能就如何处理这个问题提出建议吗
您可以创建一个列表来存储矩阵中的非零元素。为此,您需要一个结构来定义这样一个列表中的元素的外观:
struct sparseElement{
int n;
int m;
int value;
}
然后,通过循环计算非零元素,将矩阵转换为这种稀疏形式。现在您知道有多少内存,可以分配内存:
sparseElement* sparse = malloc(n * sizeof(sparseElement))
其中n
是非零元素的数量。然后你可以填写这个清单
使用C语言计算每列的非零元素之和
Matrix = [1 2 0 4 0 0 0 0;
0 1 3 0 2 0 0 0;
1 0 4 7 0 0 0 0;
0 6 0 0 1 8 0 0;
0 0 0 0 4 0 0 0;
0 0 0 0 8 1 1 0;
0 0 0 0 9 0 2 0;
0 0 0 0 0 0 7 1]
在列表中循环,并对列索引等于要计算总和的行的所有元素求和。如果您想一次性对所有列执行此操作,您可以创建一个列表,每个列有一个条目,然后将每个元素添加到相应的索引中
当然,这只是一个可能的实现。大型的、已建立的库使用更精细、更高效的结构/算法
有人能就如何处理这个问题提出建议吗
“转换为稀疏矩阵”是什么意思?这看起来已经像是一个稀疏矩阵研究“稀疏矩阵实现”或类似的东西;这是最重要的结果之一,似乎非常有用。您现在在矩阵中使用的数据结构是什么?对于(我想是高效的)稀疏表示,您有什么想法?wikipedia页面提供了一些关于如何存储这些对象的建议。要编写转换函数,您还应该知道/告诉起始密集矩阵是如何实现的。@meowgoesthedog太棒了!这很有帮助,但因为我使用的是一个非常稀疏的矩阵,其中矩阵中的零的数量是非零元素数量的10倍,所以我正在寻找其他更好的选择。一个好的稀疏矩阵仍然具有良好的访问速度。这意味着节点是水平和垂直链接的,而不是一个简单的链接列表。@AnttiHaapala我使用的是一个非常稀疏的矩阵。每10个1,我就有近100个0。因为我正在处理原始问题中提到的巨大矩阵(大约15000行x 25000列),所以这种方法可行吗?或者我应该考虑使用其他方法吗?请为非常稀疏的矩阵推荐一个最好的。