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

Posted

技术标签:

【中文标题】使用 Armadillo C++ 加载稀疏矩阵【英文标题】:Load sparse matrix with Armadillo C++ 【发布时间】:2019-05-23 14:17:52 【问题描述】:

我尝试在C++ 中使用Armadillo 加载此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 类型,问题就不存在了。

【问题讨论】:

TL;DR: raw_ascii 仅在使用 -ascii 保存 MATLAB 矩阵时才有效。 hdf5_binary 仅在矩阵从 MATLAB 导出为 HDF5 时才有效。可在此处下载的.mat 也不是这种情况。 @MaxLanghof 在哪里可以找到文件的正确标题? @MaxLanghof 我刚刚编辑了这个问题,这不是重复的。你认为解决问题的问题在我看来没有任何共同点 【参考方案1】:

以所谓的“矩阵市场”格式下载矩阵: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 版似乎可以使用)。

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);

【讨论】:

以上是关于使用 Armadillo C++ 加载稀疏矩阵的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C++ 将 Eigen 稀疏矩阵转换为数组?

稀疏矩阵与密集矩阵乘法 C++ Tensorflow

从 Rcpp Armadillo 中的 sp_mat 访问维度名称

C++犰狳稀疏矩阵类型转换

将稀疏 scipy 矩阵加载到现有的 numpy 密集矩阵中

加载用 np.save 保存的稀疏矩阵