2011-05-11 191 views
1

我試圖將MATLAB 2010b與Visual Studio 2008 Professional集成。MATLAB .NET程序集(未定義函數或變量'feedforwardnet')

我有以下的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 '''']); 

所以當我用MATLAB Engine'sCOM接口從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',但它沒有。

注:我加載從一個文件中的一些變量,包括「網」,這是一個神經網絡(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. 

注:版本我的編譯器和軟件的:

編譯器:微軟的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中的\工具箱\ NNET \ NNET \ @network \網絡。米

用C稱爲:\ Program Files文件\ MATLAB \ R2010b中的\工具箱\ NNET \ NNET \ nnnetwork \ cascadeforwardnet.m(因爲工具箱compilability規則)

C:\ Program Files文件\ MATLAB \ R2010b中\工具箱\ NNET \ NNET \ @network \ network.m

用C稱爲:程序Files \ MATLAB \ R2010b中的\工具箱\ NNET \ NNET \ nnnetwork \ feedforwardnet.m (因爲工具箱\編輯規則)

回答

1

唯一的答案我可以想出(這不是解決問題的辦法)是從Creating standalone application that contains neural network toolbox functions,指出:

您將無法編譯任何 函數訓練網絡 (如ADAPT)。雖然鏈接不包括 明確列出這些功能(如 ADAPT),但它們屬於「所有其他 命令行功能」。

但是,您可以部署使用預先訓練好的 網絡的M功能 代碼。我相信SIM功能 將配置良好。

我看到的工作流程是:

  1. 在MATLAB中,訓練你的網絡使用測試輸入/輸出
  2. 保存網絡
  3. 創建一個可部署的功能,然後使用預訓練(MAT文件?)網絡爲 新數據。網絡本身不會改變 /調整/火車在此功能
  4. 編譯和部署上述功能
相關問題