Сборка MATLAB .NET (неопределенная функция или переменная feedforwardnet)

Я пытаюсь интегрировать MATLAB 2010b с Visual Studio 2008 Professional.

У меня есть следующий метод MATLAB.

function varargout = perform( func, varargin )

%% // Set default values
workspaceDirectory = ['Results/MatlabWorkspace_' datestr(now, 'yyyy-mm-dd_HH-MM-SS')];

clear args
args = struct('workspacePath', [ workspaceDirectory '/workspace.mat'], ...
              'testArray', [], ...
              'k', 50, ...
              'rate', 0.0001, ...
              'trainingDataPath', 'P2AT_LaserImageVectorList.csv', ...
              'network', 'feedforwardnet', ...
              'initialWeights', [], ...
              'divideFcn', 'dividerand', ...
              'trainRatio', 70/100, ...
              'testRatio', 15/100, ...
              'valRatio', 15/100, ...
              'trainInd', [], ...
              'testInd', [], ...
              'valInd', [], ...
              'trainFcn', 'trainlm', ...
              'performFcn', 'mse', ...
              'biasConnect', [0; 0; 0], ...
              'layerSize', [9; 4; 1], ...
              'layerTransferFcn', ['tansig '; 'tansig '; 'purelin'], ...
              'max_fail', 10, ...
              'mu_dec', 0.04, ...
              'useInitialWeights', false, ...
              'saveResults', true);

% // Returns a modified properties structure
args = getopt(args,varargin);

args.layerTransferFcn = cellstr(args.layerTransferFcn);

if args.saveResults && ~strcmpi(func,'test')
    if (exist(workspaceDirectory, 'dir') ~= 7)
        mkdir(workspaceDirectory);
    end
end

if (strcmpi(func,'test'))
    try
        load(args.workspacePath, '-regexp', '.*');
    catch err
        Warning(err.message);
        varargin{1,1} = null;
        return;
    end

    data_inputAngle = args.testArray(2501);
    data_inputPCA = args.testArray(1:2500);

    if size(data_inputPCA,1) == 1
        data_inputPCA = data_inputPCA';
    end

    switch(featureExtractionMethod)
        case {'gha','apex'}
            % // [W, errvals] = gha(data_inputPCA, k, varargin{1,3});
            data_PCs  = W' * data_inputPCA;
            data_inputNN = [data_PCs; data_inputAngle];

        case 'nnmf'
            % // [W,H,D] = nnmf(data_inputPCA',k);
            data_PCs  = H * data_inputPCA;
            data_inputNN = [data_PCs; data_inputAngle];

        case 'pcaProcess'

        otherwise
            warning = 'ERROR: no feature extraction method has been defined.';
            Warning('ERROR: no feature extraction method has been defined.');
            varargout{1,1} = null;
            return;
    end

    % // Just to test to see if it recognizes 'feedforwardnet'.
    testnet = feedforwardnet;    % // <------------------------------- LINE 81

    % // Saving all the workspace variables to see if they are all correctly processed.
    save('all');

    varargout{1,1} = net(data_inputNN); %// <------------------------- LINE 86

    end
end

И вот как я создаю свой файл DLL для импорта в Visual Studio:

%%// Determine path names
workdir = pwd();
outdir = fullfile(workdir, 'Output');
dnetdir = fullfile(workdir, 'dotnet');

%%// Determine file names
mfile = fullfile(workdir, 'perform.m');
dnetdll = fullfile(dnetdir, 'dotnet.dll');

%%// Build .NET Assembly
eval(['mcc -N -d ''' dnetdir ''' -W ''dotnet:dotnet,' ...
        'dotnetclass,0.0,private'' -T link:lib ''' mfile '''']);

Так что все прекрасно работает, когда я использую COM- интерфейс MATLAB Engine для запуска подпрограммы внутри MATLAB из C#:

/*
 * This function calls the routine inside
 * MATLAB using the MATLAB Engine's COM interface
 */
static private float MatlabTestDebug(float[] testData, Double targetAngle)
    {
        Array X = new double[testData.Length + 1];
        testData.CopyTo(X, 0);
        X.SetValue((double)targetAngle, testData.Length);

        Array zerosX = new double[X.GetLength(0)];

        MLApp.MLAppClass matlab = new MLApp.MLAppClass();

        matlab.PutFullMatrix("testArray", "base", X, zerosX);
        matlab.PutWorkspaceData("workspacePath", "base", "workspace.mat");

        // Using Engine Interface, execute the ML command
        // contained in quotes.
        matlab.Execute("cd 'c:\\Users\\H\\Documents\\Project\\Source Code\\MatlabFiles';");
        matlab.Execute("open perform.m");
        matlab.Execute("dbstop in perform.m");
        matlab.Execute("result = perform('test', 'workspacePath', 'workspace.mat', 'testArray', testArray);");
        matlab.Execute("com.mathworks.mlservices.MLEditorServices.closeAll");

        return (double)matlab.GetVariable("result", "base");
    }

Но когда я использую сборку.NET, она не распознает "feedforwardnet". Я имел обыкновение получать сообщение об ошибке в строке 86 (net(data_inputNN)). Поэтому я добавил строку для проверки, чтобы узнать, распознает ли она хотя бы "feedforwardnet", но это не так.

Примечание: я загружаю некоторые переменные из файла, включая "net", который является нейронной сетью (load(args.workspacePath, '-regexp', '.*');)

Также в методе MATLAB, если я загружаю сохраненную "сеть" из файла, а затем сохраняю ее, чтобы посмотреть, как она обрабатывает сеть, она сохранит ее как "struct" вместо "network".

Я предполагаю, что он загружает его как структуру для начала.

У меня тоже была эта проблема внутри самой MATLAB 2009b. Вот почему я сейчас использую MATLAB 2010b, потому что, очевидно, у MATLAB 2009b не было этого конкретного набора инструментов для нейронных сетей.

Ниже приведен код C# для использования сборки.NET.

/*
 * Calls the method from inside a .NET assembly created with MATLAB
 * using Builder for .NET.
 */
private float MatlabTest(float[] testData, Double targetAngle)
    {
        if (testData != null)
        {
            dotnetclass AClass = new dotnetclass();

            Array X = new double[testData.Length + 1];
            testData.CopyTo(X, 0);
            X.SetValue((double)targetAngle, testData.Length);

            MWNumericArray XNumericArray = new MWNumericArray(X);

            MWArray[] RetVal = AClass.perform(1, "test",
                "workspacePath", "workspace.mat",
                "testArray", XNumericArray);

            Array result = ((MWNumericArray)RetVal[0]).ToVector(MWArrayComponent.Real);

            return (float)result.GetValue(0);
        }
        else
        {
            return 0f;
        }
    }

Я получаю эту ошибку в Visual Studio:

... MWMCR::EvaluateFunction error ...
Undefined function or variable 'feedforwardnet'.
Error in => perform.m at line 81.

ПРИМЕЧАНИЕ: версия моего компилятора и программного обеспечения:

Компилятор: Microsoft Visual C++ 2008 SP1 в C:\Program Files (x86)\Microsoft Visual Studio 9.0

MATLAB: R2010b (64-разрядная версия)

Visual Studio: профессиональный MVS 2008 (.NET Framework 3.5 SP1)

Microsoft Windows SDK 6.1


Недавние обновления:

Я добавил путь к инструментарию нейронной сети в mcc.

eval(['mcc -N -p ''C:\Program Files\MATLAB\R2010b\toolbox\nnet'' -d ''' dnetdir ''' -W ''dotnet:dotnet,' ...
    'dotnetclass,0.0,private'' -T link:lib -v ''' mfile '''']);

Теперь я получаю эти сообщения в mccExcludeFiles.log:

C: \ Program Files \ MATLAB \ R2010b \ toolbox \ nnet \ nnet \ @network \ network.m

вызывается C:\Program Files\MATLAB\R2010b\toolbox\nnet\nnet\nnnetwork\cascadeforwardnet.m (из-за правил совместимости набора инструментов)

C: \ Program Files \ MATLAB \ R2010b \ toolbox \ nnet \ nnet \ @network \ network.m

вызывается C:\Program Files\MATLAB\R2010b\toolbox\nnet\nnet\nnnetwork\feedforwardnet.m (из-за правил компиляции инструментария)

1 ответ

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

Вы не сможете скомпилировать любую функцию, которая обучает сеть (например, ADAPT). Хотя ссылка не содержит явного списка этих функций (например, ADAPT), они попадают под "Все остальные функции командной строки".

Однако вы можете развернуть код функции M, который использует предварительно обученную сеть. Я считаю, что функция SIM-карты будет развернута нормально

Рабочий процесс, который я вижу:

  1. В MATLAB обучите вашу сеть, используя тестовый ввод / вывод
  2. Сохранить сеть (файл MAT?)
  3. Создайте развертываемую функцию, которая затем использует предварительно обученную сеть для новых данных. Сама сеть не будет менять / адаптировать / обучать этой функции
  4. Скомпилируйте и разверните вышеупомянутую функцию
Другие вопросы по тегам