Ошибка выполнения при вызове скомпилированной функции 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