Загрузка разреженной матрицы с помощью Armadillo C ++ - PullRequest
1 голос
/ 23 мая 2019

Я пытаюсь загрузить эту матрицу , используя Armadillo в C++.Это мой простой код:

#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 голосов
/ 24 мая 2019

Скачать матрицу в так называемом формате "матричный рынок": https://sparse.tamu.edu/MM/Rothberg/cfd1.tar.gz

Извлеките матрицу из архива .tar.gz, получив cfd1/cfd1.mtx. Файл имеет заголовок, который должен быть удален перед загрузкой файла. Используя текстовый редактор, удалите первые 14 строк в файле MTX. Первая строка должна иметь 1 1 1. Сохраните отредактированный файл под тем же именем.

Загрузить отредактированный матричный файл в Armadillo, используя опцию coord_ascii. Вам понадобится последняя версия Armadillo, которая поддерживает coord_ascii (версия 9.400, кажется, работает).

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

В матрице Armadillo индексы начинаются с 0 (из-за соглашений C ++), в то время как в файле рынка матрицы они начинаются с 1. Поэтому вам нужно удалить первую строку и столбец из X, чтобы учесть это. Это можно сделать через подматрицы :

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