使用 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++ 加载稀疏矩阵的主要内容,如果未能解决你的问题,请参考以下文章
从 Rcpp Armadillo 中的 sp_mat 访问维度名称