Чтение пользовательского класса в приложении C из MAT-файла - PullRequest
0 голосов
/ 31 января 2019

Я хочу получить доступ к свойствам пользовательского класса MATLAB в MAT-файле в автономном приложении C ++.Пользовательский класс - это класс, созданный в MATLAB с чем-то вроде этого:

classdef customClass
    properties
        myProp
    end

    methods
        function obj = customClass(arg1,arg2)
           obj.myProp = arg1 + arg2
        end
    end
end

Экземпляр этого класса теперь сохраняется в файле MAT и должен быть доступен для отдельного приложения на языке C.

Очевидно, MATLAB предлагает библиотеку для чтения MAT-файлов в приложениях на Си.Это нормально работает для «обычных» типов, и API, кажется, предлагает функцию mxGetProperty для доступа к пользовательским объектам.Однако, если я попытаюсь выполнить минимальный пример с использованием этой функции, произойдет сбой с пустым утверждением в management.cpp:671.Минимальный пример:

#include <iostream>
#include "mat.h"

int main()
{
    MATFile* file = matOpen("test.mat", "r");
    if (file == nullptr)
        std::cout << "unable to open .mat" << std::endl;

    mxArray* customClass = matGetVariable(file, "c");
    if (customClass == nullptr)
        std::cout << "unable to open tcm" << std::endl;

    mxArray* prop = mxGetProperty(customClass, 0, "myProp");

    if (prop == nullptr)
        std::cout << "unable to access myProp";
}

При более внимательном рассмотрении документации выявляется ограничение: mxGetProperty не поддерживается для автономных приложений, таких как приложения, созданные с помощью API механизма MATLAB.

Есть ли другая возможность доступа к customClass в MAT-файле из автономного приложения C ++?

1 Ответ

0 голосов
/ 31 января 2019

Переменные classdef являются непрозрачными объектами в MATLAB, и детали того, как свойства хранятся в них, не публикуются.Вы должны использовать официальные функции API, чтобы получить их (и mxGetProperty делает глубокую копию, кстати).Итак, вы застряли.Мой совет - извлечь интересующие вас свойства из объекта, а затем сохранить их в файле mat.

...