Как загрузить матрицу Matlab с броненосцем?

0

Я знаю, что матрица Matlab может быть загружена в программу C++ в некотором смысле, хотя ни один из этих способов не кажется эффективным или удобным. Я видел, как другие модифицировали заголовок файла.mat, затем он может быть непосредственно загружен в программу C++ с помощью armadillo.

У кого-нибудь есть идеи, как изменить заголовочный файл?

Это не просто сохранить файл.lt в Matlab в формате ascii. Время загрузки и объем памяти больше, чем двоичный формат. Чтобы сохранить файл двоичного мата размером 2 ГБ, мне нужно хранить не менее 20 ГБ в формате ASCII. Загрузка файла бинарного файла 100 МБ занимает менее 1 секунды, загрузка текстовых данных ASCII одинакового размера занимает гораздо больше времени.

Я не думаю, что сохранить файл matlab mat в формате ASCII и загрузить его в armadillo - это хорошее решение.

  • 0
    Если у вас есть библиотека HDF5, настройте Armadillo для ее использования. Затем сохраните матрицы в Matlab в формате HDF5, которые Armadillo (с включенным HDF5) должен уметь читать. Другой вариант - использовать библиотеку MATIO для чтения файлов Matlab: sourceforge.net/projects/matio
  • 0
    В качестве альтернативы, вы можете собрать свою программу на C ++ как исполняемый файл Matlab (MEX) . Matlab передает свои переменные в mex-функции по ссылке.
Теги:
armadillo

2 ответа

3

Согласно документации Армадилло:

file_type может быть одним из следующих:
...
raw_ascii:
Числовые данные, хранящиеся в необработанном формате ASCII, без заголовка. Числа разделяются пробелами. Количество столбцов должно быть одинаковым в каждой строке. Кубы загружаются как один фрагмент. Данные, сохраненные в Matlab/Octave с использованием опции -ascii, можно прочитать в Armadillo, за исключением сложных чисел. Сложные числа хранятся в стандартной нотации C++, которая представляет собой кортеж, окруженный скобками: например. (1,23,4,56) указывает 1,24 + 4,56i.

Поэтому вы можете загрузить матрицу Matlab в текстовом формате, содержащуюся в файле MatlabMatrix.mat, используя следующий код:

arma::mat fromMatlab;
fromMatlab.load("MatlabMatrix.mat", arma::raw_ascii);

Кроме того, связанный с этим вопрос можно найти здесь.

  • 0
    Привет, может быть, мне нужно немного изменить мои вопросы. Мои файлы данных более 1 ГБ. Чтобы загрузить «.mat» файл в формате ASCII, это все равно, что загрузить текстовый файл. Время загрузки довольно медленное. Для загрузки двоичного файла .mat размером 100 МБ у меня уходит менее 1 секунды. Чтобы загрузить файл ascii .mat, мне понадобится более 10 секунд. Есть большая разница, если я хочу загрузить 1 ГБ файл. На самом деле я использовал ваше решение, хотя я чувствую, что могу сделать лучше
  • 0
    параметр загрузки должен быть arma :: raw_ascii, а не arma :: arma_ascii, arma_ascii имеет заголовок с информацией о размерах для ускорения загрузки
Показать ещё 1 комментарий
2

Вы можете экспортировать свои данные в Matlab в двоичном формате низкого уровня, а затем загрузить его в arma::raw_binary параметра arma::raw_binary.

например, в MATLAB:

m=10;
A = randn(m,m);
name = 'test.bin'

[F,err] = fopen(name,'w');
if F<0,error(err);end

fwrite(F,A,'double');
fclose(F);

груз с броненосцемей:

arma::mat A;
std::string name = "test.bin";

A.load(name,arma::raw_binary);
A.print("A");

Единственное, что вы теряете матричные размеры исходной матрицы, так как armadillo загружает ее в векторизованной форме, поэтому вам нужно изменить ее на каждую руку после загрузки.

Чтобы включить размеры матрицы, вы можете имитировать заголовок arma::arma_binary при сохранении в matlab, а затем при загрузке использовать параметр arma::arma_binary. Если вас интересует этот параметр, я также могу рассказать вам, как это сделать.

  • 0
    Можете ли вы уточнить, как включить размеры матрицы?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню