0

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

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

完毕。

4

1 回答 1

4

COM 接口支持结构或稀疏数组。我的意思是你不能直接在 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]

因此,您可以在不指定输出的情况下加载文件,这样变量就可以作为单独的变量直接加载。

于 2013-05-29T21:37:44.813 回答