使用Armadillo C ++加载稀疏矩阵

时间:2019-05-23 14:17:52

标签: c++ sparse-matrix armadillo

我尝试使用Armadillo中的C++加载此matrix。 这是我的简单代码:

#include <string>
#include <vector>
#include <iostream>
#include <armadillo>

int main(void) {

  arma::sp_mat matrix;
  matrix.load("./matrix/cfd1.mat", arma::raw_ascii);

  return 0;
}

在编译时,代码不会生成任何警告,但是当我运行可执行文件时,这是输出:

  

警告:SpMat :: load():不支持的文件类型

     

警告:SpMat :: load():无法读取./matrix/cfd1.mat

我尝试用arma::raw_ascii来更改arma::hdf5_binary,但是效果不一样。

编辑

我认为这不是重复的,因为问题不是文件的标题。即使我使用arma::auto_detect,问题仍然存在。 如果我使用mat类型,就没有问题。

1 个答案:

答案 0 :(得分:0)

以所谓的“矩阵市场”格式下载矩阵:https://sparse.tamu.edu/MM/Rothberg/cfd1.tar.gz

从.tar.gz存档中提取矩阵,以获得cfd1/cfd1.mtx。该文件具有一个标头,必须先将其剥离,然后才能加载该文件。使用文本编辑器删除mtx文件中的前14行。第一行应包含1 1 1。用相同的名称保存编辑后的文件。

使用coord_ascii选项将编辑的矩阵文件加载到Armadillo中。您将需要支持coord_ascii(版本9.400似乎有效)的Armadillo的最新版本。

sp_mat X;
X.load("cfd1/cfd1.mtx", coord_ascii);

在Armadillo中,矩阵索引从0开始(由于C ++约定),而在矩阵市场文件中,它们从1开始。因此,您需要从X中删除第一行和第一列,以将其考虑在内。这可以通过submatrices完成:

X = X.tail_rows(X.n_rows-1);
X = X.tail_cols(X.n_cols-1);