4

私はMATLAB処理ルーチンを呼び出す必要があるC#プログラムを書いています。私はMATLABのCOMインターフェイスを見てきました。残念ながら、COMインターフェイスは、交換できるデータの種類に関してかなり制限されているようです。行列と文字配列はサポートされていますが、COMインターフェイスを使用してC#とMATLABの間で構造体データまたはセル配列を交換することはサポートされていないようです。たとえば、次のコード(IM000000という名前のDICOMイメージが適切なファイルフォルダーに存在すると仮定)では、MATLAB変数「img」と「header」はそれぞれ256x256のint16行列と構造体です。GetWorkspaceData呼び出しは、「img」では正常に機能しますが、「header」は構造体であるため、「header」ではnullを返します。

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 Builder NEアドオンによって十分にサポートされていますか?

4

2 に答える 2

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
于 2011-03-30T20:09:13.123 に答える
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 を参照してください。

于 2011-03-30T17:55:27.023 に答える