我正在尝试加载这个 matrix在 C++
中使用 Armadillo
。
这是我的简单代码:
#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;
}
在编译时,代码不会生成任何警告,但是当我运行可执行文件时,这是输出:
warning: SpMat::load(): unsupported file type
warning: SpMat::load(): couldn't read ./matrix/cfd1.mat
我尝试用 arma::hdf5_binary
更改 arma::raw_ascii
,但效果不一样。
编辑
我认为这不是重复的,因为问题不在于文件的标题。即使我使用 arma::auto_detect
问题仍然存在。
如果我使用 mat
类型,问题就不存在了。
最佳答案
以所谓的“矩阵市场”格式下载矩阵:https://sparse.tamu.edu/MM/Rothberg/cfd1.tar.gz
从 .tar.gz 存档中提取矩阵,获得 cfd1/cfd1.mtx
。该文件有一个标题,必须在加载文件之前将其删除。使用文本编辑器,删除 mtx 文件中的前 14 行。第一行应该有 1 1 1
。以相同的名称保存编辑后的文件。
使用 coord_ascii
在 Armadillo 中加载编辑后的矩阵文件选项。您将需要支持 coord_ascii
的 Armadillo 的最新版本(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);
关于c++ - 用 Armadillo C++ 加载稀疏矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56277268/