2013-05-29 4 views
0

У меня есть рабочее пространство, называемое mat.mat, и мне нужно загрузить имена переменных из этого в C# через консольное приложение. У меня проблема, когда у меня есть список переменных в struct, я пробовал использовать GetWorkspaceData или GetCharArray и ничего не получаю. Мой код:Загрузка переменных из рабочей области Matlab в C#

 MLApp.MLApp matlab = new MLApp.MLApp();    
     string loadCommand = @"zmienne=load('C:\myPath\mat.mat')"; 
     matlab.Execute(loadCommand); 

Выполнено.

+0

Используете ли вы технику для обычных переменных (строка, double, matrix ...)? Как вы пытаетесь получить доступ к переменным, которые вы читаете? Не нужно ли C# знать структуру данных до того, как она сможет их получить? Еще несколько строк кода в вашем «вот что я пытался» было бы полезно. – Floris

+0

Да, он работает для переменных convetional, но не для struct. Это первый раз, когда я работаю с Matlab и C# вместе. Пока у меня нет никаких проблем, пока я не должен каким-то образом преобразовать структуру Matlab в C#, и я не знаю, как это сделать. – Shafter

+0

Вы читали некоторые из связанных статей на сайте Mathworks? Вы можете начать с http://www.mathworks.com/help/matlab/matlab_external/working-with-structures.html. Это может быть сложно (учитывая, как работает C#), чтобы сделать это, не зная деталей структуры перед компиляцией. Как вы надеетесь получить доступ к данным? – Floris

ответ

3

COM interface не support структур или разреженных массивов. Я имею в виду, вы не можете напрямую передавать их между MATLAB и .NET, если вы попробуете вы получите следующее сообщение об ошибке напечатанной в командном окне MATLAB:

Предупреждения: ActiveX - недопустимый тип аргумента или значение

Обходным путем является доступ к полям структуры на стороне MATLAB и сохранение каждого в переменной, которую можно перевести на C# с использованием одного из поддерживаемых правил преобразования.

Вот пример:

static void Main(string[] args) 
{ 
    // load MAT-file contents into a structure variable 
    matlab.Execute("S = load('wind.mat')"); 

    // get field and store in separate variable 
    matlab.Execute("x = S.x;"); 

    // obtain variable "x" from MATLAB into C# 
    var x = (double[,,]) matlab.GetVariable("x", "base"); 

    // print array in C# 
    Console.WriteLine("ndims(x) = {0}, numel(x) = {1}", x.Rank, x.Length); 
    for (int i = 0; i < x.GetLength(0); i++) 
    { 
     for (int j = 0; j < x.GetLength(1); j++) 
     { 
      for (int k = 0; k < x.GetLength(2); k++) 
      { 
       Console.WriteLine("x[{0},{1},{2}] = {3}", i, j, k, x[i,j,k]); 
      } 
     } 
    } 
} 

В приведенном выше примере, MAT-файл, используемый содержит кучу многомерных матриц double типа:

>> whos -file wind.mat 
    Name  Size    Bytes Class  Attributes 

    u   35x41x15   172200 double    
    v   35x41x15   172200 double    
    w   35x41x15   172200 double    
    x   35x41x15   172200 double    
    y   35x41x15   172200 double    
    z   35x41x15   172200 double    

вещь, чтобы отметить в Конечно, когда вы load MAT-файл с выходным аргументом, он вернет структуру, чьи поля являются переменными, хранящимися в этом файле:

>> S = load('wind.mat') 
S = 
    u: [35x41x15 double] 
    v: [35x41x15 double] 
    w: [35x41x15 double] 
    x: [35x41x15 double] 
    y: [35x41x15 double] 
    z: [35x41x15 double] 

Таким образом, вы можете загрузить файл без указания вывода, таким образом, переменные напрямую загружаются как отдельные.