Совместимость C # и MATLAB для нематричных типов данных - PullRequest
4 голосов
/ 08 марта 2011

Я пишу программу на C #, которая должна вызывать процедуры обработки MATLAB.Я смотрел на COM-интерфейс MATLAB.К сожалению, интерфейс COM выглядит довольно ограниченным с точки зрения типов данных, которыми можно обмениваться.Поддерживаются матрицы и символьные массивы, но, похоже, не поддерживается обмен структурными данными или массивами ячеек между C # и MATLAB с использованием интерфейса COM.Например, в следующем коде (при условии, что образ DICOM с именем IM000000 присутствует в соответствующей папке файлов), переменные MATLAB 'img' и 'header' представляют собой матрицу 256x256 int16 и структуру соответственно.Вызов GetWorkspaceData прекрасно работает для «img», но возвращает «ноль» для «заголовка», поскольку «заголовок» является структурой.

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

   }  
}

Существует ли подходящий обходной путь для упорядочения данных структуры в / из MATLAB с использованием COMинтерфейс?Если нет, хорошо ли эта функция поддерживается надстройкой MATLAB Builder NE?

Ответы [ 2 ]

2 голосов
/ 31 марта 2011

Я решил использовать надстройку 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
1 голос
/ 30 марта 2011

Подумайте над тем, чтобы взглянуть на LabSharp (обертка вокруг API движка Matlab). Затем вы можете поменять структуру следующим образом:

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

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

Примечание: эта оболочка LGPL не моя, для получения более подробной информации обратитесь к ее API.

...