我有一个名为“mat.mat”的工作区,我必须通过控制台应用程序将变量名称下载到C#。我有一个问题,当我在struct
中有变量列表时,我尝试使用GetWorkspaceData
或GetCharArray
并且什么都没得到。我的代码:
MLApp.MLApp matlab = new MLApp.MLApp();
string loadCommand = @"zmienne=load('C:\myPath\mat.mat')";
matlab.Execute(loadCommand);
完成。
答案 0 :(得分: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]
所以你可以在没有指定输出的情况下加载文件,这样变量就可以直接加载为单独的变量。