1

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

これは、Visual Studio にインポートする DLL ファイルを作成する方法です。

%%// 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 '''']);

したがって、 MATLAB エンジンの COMインターフェイスを使用して C# から MATLAB 内でルーチンを実行すると、すべてが完全に正常に動作します。

/*
 * 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 メソッドで、保存された「ネットワーク」をファイルからロードし、それを保存してネットワークの処理方法を確認すると、「ネットワーク」ではなく「構造体」として保存されます。

そもそも構造体としてロードしていると思います。

MATLAB 2009b 自体でもこの問題が発生しました。これが、私が現在 MATLAB 2010b を使用している理由です。明らかに MATLAB 2009b には、この特定のニューラル ネットワーク ツールボックスがなかったからです。

以下は、.NET アセンブリを使用するための C# コードです。

/*
 * 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 SP1C:\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 によって呼び出されます (ツールボックスのコンパイル規則のため)

4

1 に答える 1

1

私が思いついた唯一の答え (これは問題の解決策ではありません) は、ニューラル ネットワーク ツールボックス関数を含むスタンドアロン アプリケーションの作成からのもので、次のように述べています。

ネットワークをトレーニングする関数 (ADAPT など) をコンパイルすることはできません。リンクにはこれらの機能 (ADAPT など) が明示的にリストされていませんが、「その他のすべてのコマンド ライン機能」に分類されます。

ただし、事前学習済みのネットワークを使用する M 関数コードをデプロイすることはできます。SIM機能は問題なく展開されると思います。

私が見るワークフローは次のとおりです。

  1. MATLAB では、テスト入力/出力を使用してネットワークをトレーニングします
  2. ネットワークを保存します (MAT ファイル?)
  3. 事前トレーニング済みのネットワークを新しいデータに使用するデプロイ可能な関数を作成します。ネットワーク自体は、この関数で変更/適応/トレーニングしません
  4. 上記の関数をコンパイルしてデプロイする
于 2011-05-12T15:33:57.503 に答える