稀疏矩阵坐标存储格式:从行主要转换为列主要

时间:2014-11-27 19:31:24

标签: c++ matrix

我有两个以协调存储格式稀疏矩阵运行的c ++函数(foo,goo), 也就是说,矩阵给出为3个数组:row_index [nnz],column_index [nnz],value [nnz] 其中nnz是非零元素的数量。

foo按行主要顺序"返回稀疏矩阵"例如:

  • 1 1 4.000000
  • 1 2 4.000000
  • 2 1 6.000000
  • 2 3 8.000000
  • 3 3 10.000000
相反,goo需要通过排序"按列主要顺序"来获取向量,即:

  • 1 1 4.000000
  • 2 1 6.000000 //此更改
  • 1 2 4.000000 //此更改
  • 2 3 8.000000
  • 3 3 10.000000

如何以最有效的方式进行此转换?

其他信息: goo还支持压缩列格式。

1 个答案:

答案 0 :(得分:0)

如果您可以控制数据结构的执行,那么干净,高效的方法是将格式存储为结构数组,然后将w.r.t排序到相关列,例如

typedef std::tuple<size_t,size_t,double> elem_t;
// std::get<0>(storage[i]) is the row index of the i-th non-zero
// std::get<1>(storage[i]) is the col index of the i-th non-zero
// std::get<2>(storage[i]) is the value of the i-th non-zero
std::vector<elem_t> storage;
// this sort can be parallel
std::sort(storage.begin(),storage.end(),[](const elem_t& L, const elem_t& R){return std::get<1>(L)<std::get<1>(R);});

如果没有,可以编写一个仿函数来根据列进行索引排序,然后进行置换。这当然更麻烦,会产生内存开销。