将变量从Matlab工作空间下载到C#

时间:2013-05-29 13:32:32

标签: c# matlab com com-interop

我有一个名为“mat.mat”的工作区,我必须通过控制台应用程序将变量名称下载到C#。我有一个问题,当我在struct中有变量列表时,我尝试使用GetWorkspaceDataGetCharArray并且什么都没得到。我的代码:

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

完成。

1 个答案:

答案 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]

所以你可以在没有指定输出的情况下加载文件,这样变量就可以直接加载为单独的变量。