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]
Таким образом, вы можете загрузить файл без указания вывода, таким образом, переменные напрямую загружаются как отдельные.
Используете ли вы технику для обычных переменных (строка, double, matrix ...)? Как вы пытаетесь получить доступ к переменным, которые вы читаете? Не нужно ли C# знать структуру данных до того, как она сможет их получить? Еще несколько строк кода в вашем «вот что я пытался» было бы полезно. – Floris
Да, он работает для переменных convetional, но не для struct. Это первый раз, когда я работаю с Matlab и C# вместе. Пока у меня нет никаких проблем, пока я не должен каким-то образом преобразовать структуру Matlab в C#, и я не знаю, как это сделать. – Shafter
Вы читали некоторые из связанных статей на сайте Mathworks? Вы можете начать с http://www.mathworks.com/help/matlab/matlab_external/working-with-structures.html. Это может быть сложно (учитывая, как работает C#), чтобы сделать это, не зная деталей структуры перед компиляцией. Как вы надеетесь получить доступ к данным? – Floris