Ошибка выполнения при вызове скомпилированной функции Matlab из C#

Я использую Matlab 2015a и разработал, обучил и протестировал ансамбль классификации (увеличенное дерево) и сохранил наилучшую обученную модель (файл.mat).

Поскольку я хочу использовать эту модель в приложении.Net C#, я создал файл.m, чтобы загрузить файл.mat, содержащий обученный классификатор, и использовать его для прогнозирования результата на основе переданных функций (см. Код для файла.m ниже).

function [ypredict score] = fnTrainedClassifer( input_args )
  load ('trainedClassifier.mat');
  [ypredict score] = predict(trainedClassifier,input_args);
end

Затем я использовал компилятор Matlab для создания сборки.Net и убедился, что включил файл.mat в раздел для файлов, необходимых для работы вашей библиотеки. Пока все хорошо... Затем я создал быстрое консольное приложение C# для тестирования библиотеки (см. Код приложения ниже) и запустил ее.

using System;
using MathWorks.MATLAB.NET.Arrays;
using TrainedClassifierComp;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            MLTestClass theModel = null;   /* Stores deployment class instance */
            MWStructArray inputs = null;   /* Sample input data */
            MWArray[] result = null;       /* Stores the result */
            MWNumericArray prediction = null;  /* Ouptut data extracted from result */
            MWNumericArray score = null;  /* Ouptut data extracted from result */

            /* Create the new deployment object */
            theModel = new MLTestClass();

            /* Create an MWStructArray */
            String[] myFieldNames = { "1", "2", "3", "4", "5", "6", "7", "8" };
            inputs = new MWStructArray(1, 8, myFieldNames);

            /* Populate struct with some sample inputs  */
            inputs["1", 1] = 1;
            inputs["2", 2] = 2;
            inputs["3", 3] = 3;
            inputs["4", 4] = 4;
            inputs["5", 5] = 5;
            inputs["6", 6] = 6;
            inputs["7", 7] = 7;
            inputs["8", 8] = 8;

            /* Show some of the sample data */
            Console.WriteLine("Inputs: ");
            Console.WriteLine(inputs.ToString());

            /* Pass it to a MATLAB function */
            result = theModel.fnTrainedClassifier(1, inputs);
            prediction = (MWNumericArray) result[0];
            score = (MWNumericArray)result[1];

            /* Show the results */
            Console.WriteLine("Prediction: ");
            Console.WriteLine(prediction.ToString());
            Console.WriteLine("Score: ");
            Console.WriteLine(prediction.ToString());
        }
    }
}

К сожалению, я обнаружил следующую ошибку времени выполнения, которая не принесла результатов при поиске в Google:

Предупреждение: Переменная 'trainingClassifier', изначально сохраненная как classreg.learning.classif.ClassificationEnsemble, не может быть создана как объект и будет считана как uint32. В fnTrainedClassifier (строка 4) Ошибка при использовании предиката (строка 84) Системы класса uint32 нельзя использовать с командой "предиката". Сначала преобразуйте систему в указанную модель, например, с помощью команды "idss". Ошибка в fnTrainedClassifier (строка 5)

Будем весьма благодарны за любые рекомендации о том, как решить эту проблему. Информация о том, как вы смогли достичь чего-то подобного.

Дополнительная информация: Я пробовал пару других систем ИИ, например, нейронную сеть, и у меня та же проблема. Мне кажется, что я не подхожу к этому правильно - есть ли другой способ использования функций Matlab во внешних скомпилированных языках, таких как C#?

1 ответ

Вопрос задан давно, но я столкнулся с той же проблемой. Я надеюсь, что следующее решение поможет некоторым сэкономить время. Таким образом, когда объект класса загружается из файла.mat, кажется, что компилятор Matlab читает типы классов, но не загружает сам класс. Поэтому как-то нам нужно добавить определение класса экземпляра объекта.

Чтобы заставить компилятор загрузить требуемые классы, я создал пустой объект класса, затем я загрузил объект из файла.mat и назначил его пустому объекту. Ваш код циновки должен быть примерно таким;

function [ypredict score] = fnTrainedClassifer( input_args )
     trainedClassifier = classreg.learning.classif.ClassificationEnsemble.empty; % only this line is added.
     load ('trainedClassifier.mat');
     [ypredict score] = predict(trainedClassifier,input_args);
end
Другие вопросы по тегам