Хранить данные C ++ в октаве с помощью интерфейса данных? - PullRequest
0 голосов
/ 11 июля 2020

Matlab предлагает интерфейс данных для C / C ++, см. здесь . Это позволяет пользователям экспортировать данные из C / C ++ во время выполнения в форматы Matlab (файлы * .mat). Это означает, что вы можете экспортировать данные из программы C ++, а затем вернуться к данным с помощью Matlab для их анализа.

Я хотел бы начать использовать альтернативу с открытым исходным кодом, Octave, вместо Matlab. Однако меня смущают интерфейсы C / C ++, которые предлагает Octave. На данный момент я понимаю, что я могу вызывать внешние подпрограммы из Octave, используя их интерфейс внешнего кода .

Но могу ли я также сделать обратное и сохранять данные из моей программы C ++ в октаву во время время выполнения? Если да, то мы будем очень признательны за указатели на минимальный пример.

1 Ответ

1 голос
/ 11 июля 2020

Это, вероятно, не ответ для вас, но писать его как комментарий было слишком длинным и плотным, поэтому я пишу как ответ для удобства, плюс, надеюсь, при попытке прояснить ситуацию он все равно может дать вам ответ .

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

  1. Matlab предлагает два интерфейса, один для C и один для C ++. Это полностью отдельные интерфейсы.

  2. Это общие интерфейсы, для записи функции, скажем, C, и вызова этой функции из Matlab или наоборот. Они не предназначены для «экспорта данных». может иметь возможность хранить данные из кода C в .mat, вызывая функцию matlab "save" через предоставленный api, но я не могу придумать веской причины для этого через C, а не как часть сценария matlab, который вызывает функцию C -written для обработки некоторых данных, а затем вызывает 'save' из matlab для сохранения результата.

  3. Octave поддерживает интерфейс Matlab "C" (так называемые файлы ".mex"). Он не поддерживает интерфейс Matlab "C ++". Но у него есть собственный интерфейс "C ++", а именно файлы ".oct".

  4. Если у вас есть пример файла .mex, который выполняет то, что вы просите, то, вероятно, он может также может быть скомпилирован в октаве с небольшими изменениями или без них (за исключением включения правильных имен библиотек для отражения заголовков октав).

  5. «Я могу вызывать внешние подпрограммы из Octave» <- вы можете присвоить общему коду C ++ имя функции и преобразовать ее, чтобы вы могли вызывать ее из октавы. Более того, вы можете передать этой функции входные данные из октавы, позволить ей обрабатывать вычисления в C ++, а затем вернуть результат обратно в октаву. Вы это имеете в виду? Если да, то да, это возможно, и в разделе руководства, на который вы ссылаетесь, есть примеры того, как это сделать (кстати, обратите внимание, что вы ссылаетесь на более старую версию, новейшая версия руководства - octave.org/doc/v5 .2.0) </p>

  6. Octave также предоставляет интерфейс для вызова функций Octave непосредственно из кода C ++ (будь то в контексте файлов .oct, предназначенных для использования в октаве, либо в контексте автономных исполняемых файлов C ++, которые хотели бы использовать внутри октавные функции).

Когда вы говорите «хранить данные», мне кажется, что вы в основном спрашиваете о пункте № 5, т.е. передать данные в качестве входных данных в функцию, написанную на C ++, заставить C ++ что-то сделать с этими данными, а затем вернуть результат обратно в октавное рабочее пространство. Это правильно? Или вы буквально просите способ создать файл .mat конкретно из C ++?

Если то, что вы просите, просто первое, то в руководстве есть множество примеров. Например, если вы хотите попробовать вариант в конце этой страницы: https://octave.org/doc/v5.2.0/Matrices-and-Arrays-in-Oct_002dFiles.html#Matrices -and-Arrays-in-Oct_002dFiles , тогда скажите, что код сохранен в файле addtwomatrices.cpp, тогда вы можете скомпилировать ( например, с вашего linux терминала) это так:

$ mkoctfile -c addtwomatrices.cpp
$ mkoctfile ./addtwomatrices.o -o ./addtwomatrices

А затем вызовите его из октавы следующим образом:

> addtwomatrices( eye(2), magic(2) )
ans =
   5   3
   1   3

ОБНОВЛЕНИЕ

Вот пример создания матрицы непосредственно из C ++ и последующего сохранения ее в формате, совместимом с октавой.

// in testmat.cpp
# include <octave/oct.h>
# include <octave/ls-oct-text.h>   /* defines save_text_data */

int main ()
{
 // Create a matrix and fill it with values
    Matrix M(3,3);
    for (int i = 0;  i < 9;  ++i )   { M.elem(i) = i+1.; }

 // Save to disk
    std::ofstream out_file_stream( "out.mat" );
    save_text_data ( out_file_stream,
                     octave_value(M),
                     std::string("M_matrix"),   // variable name
                     true,                      // mark as global?
                     5                          // precision
                   );

    out_file_stream.close();
}

Скомпилировать, связать и запустить:

mkoctfile -c testmat.cpp
mkoctfile --link-stand-alone -o testmat testmat.o
LD_LIBRARY_PATH=/opt/octave-5.2.0/lib/octave/5.2.0 ./testmat   # change path accordingly

Подтвердить из октавы наруж. мат сохранен правильно и может быть открыт в октаве:

octave:1> load out.mat
octave:2> M_matrix
M_matrix =
   1   4   7
   2   5   8
   3   6   9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...