2011-03-07 83 views
4

我在寫一個需要調用MATLAB處理例程的C#程序。我一直在看MATLAB的COM接口。不幸的是,就可交換數據的類型而言,COM接口似乎相當有限。支持矩陣和字符數組,但似乎沒有支持使用COM接口在C#和MATLAB之間交換結構數據或單元陣列。例如,在下面的代碼中(假設名爲IM000000的DICOM圖像存在於相應的文件夾中),MATLAB變量'img'和'header'分別是一個256x256 int16矩陣和一個結構體。 GetWorkspaceData調用適用於'img',但'header'返回null,因爲'header'是一個結構體。非矩陣數據類型的C#&MATLAB互操作性

public class MatlabDataBridge 
{ 
    MLApp.MLAppClass matlab; 

    public MatlabDataBridge() 
    { 
     matlab = new MLApp.MLAppClass(); 
    } 

    public void ExchangeData() 
    { 
     matlab.Execute(@"cd 'F:\Research Data\'"); 
     matlab.Execute(@"img = dicomread('IM000000');"); 
     matlab.Execute(@"header = dicominfo('IM000000');"); 

     matlab.GetWorkspaceData(@"img", "base", out theImg); // correctly returns a 2D array 
     matlab.GetWorkspaceData(@"header", "base", out theHeader); // fails, theHeader is still null 

    } 
} 

是否有一個合適的解決方法,使用COM接口將結構數據編組到MATLAB中/從MATLAB進行編組?如果不是的話,MATLAB Builder NE插件是否支持該功能?

+1

考慮使用C++/CLI。與.NET託管代碼(包括C#)和Matlab的本地MEX API無縫兼容。 – 2011-03-07 23:49:22

回答

2

我最終使用MATLAB Builder NE插件來解決這個問題。代碼最終看起來像這樣:

using MathWorks.MATLAB.NET.Arrays; 
using MathWorks.MATLAB.NET.Utility; 
using MyCompiledMatlabPackage; // wrapper class named MyMatlabWrapper is here 

... 


matlab = new MyMatlabWrapper(); 

MWStructArray foo = new MWStructArray(1, 1, new string[] { "field1", "field2" }); 
foo["field1", 1] = "some data"; 
foo["field2", 1] = 5.7389; 

MWCellArray bar = new MWCellArray(1, 3); 
bar[1, 1] = foo; 
bar[1, 2] = "The quick brown fox jumped over the lazy dog."; 
bar[1, 3] = 7.9; 

MWArray result[]; 
result = matlab.MyFunction(foo, bar); 

// Test the result to figure out what kind of data it is and then cast 
// it to the appropriate MWArray subclass to extract and use the data 
+0

你可以發表2D矩陣的代碼嗎? – Gilad 2013-04-09 07:36:52

1

考慮看一下LabSharp(Matlab引擎API的封裝)。然後,您可以像這樣的交換結構:

var engine = Engine.Open(false);  
var array = MxArray.CreateStruct(); 

array.SetField("MyField1", "toto"); 
array.SetField("MyField2", 12.67); 
engine.SetVariable("val", array); 

注:此LGPL包裝是不是我的,請看看它的API的更多細節。