将MWCellArray从C#转移到Matlab

时间:2012-05-11 11:31:36

标签: c# matlab com matlab-deployment

让我们说,为了论证,我有MWCellarray temp:

MWCellArray temp = new MWCellArray(10000,11);

现在我想调用一个Matlab函数来运行一些简单的计算:

            MLApp.MLApp matlab = new MLApp.MLApp();
            <THIS IS THE MISSING STEP>
            matlab.Execute("open 'C:\Program Filez\mymatlabcode.m'");
            matlab.Execute("[thisismyoutput] = mymatlabcode(temp)");

我现在需要确保我可以先将temp传递到matlab工作空间。显然我的第一个想法是:

 matlab.PutWorkspaceData("putworkspace", "base", temp);

但是没有:{“未实现(HRESULT异常:0x80004001(E_NOTIMPL))”}

貌似我将不得不将MWCellArray转换为字符串数组以使用该命令....

        //{
        //    int[] kDimensions = temp.Dimensions;
        //    string[,] stemp = new string[kDimensions[0], kDimensions[1]];

        //    for (int i = 0; i < kDimensions[0]; i++)
        //    {
        //        for (int j = 0; j < kDimensions[1]; j++)
        //        {
        //            stemp [i, j] = (temp[i + 1, j + 1]).ToString();
        //        }
        //    }
        //}

这很慢。真正的实施是大约15个MWCellArrays,这个转换需要15-20分钟。

因此。我怎样才能以明智的方式做到这一点?我看不到任何其他方法来启用传输。 matlab.PutCharArray和matlab.PutFullMatrix似乎都不适用。

有没有办法加速循环?我是c#

的新手

或者我认为我应该能够将MWCellArray保存为C盘上的.mat文件,然后加载它? (装载很容易,省钱让我难过)

我会对您提供的任何见解感兴趣。感谢。

2 个答案:

答案 0 :(得分:3)

我认为你可能会混淆MATLAB和.NET之间的两种类型的交互。

  1. 您可以使用MLApp.MLApp将MATLAB的实时副本作为COM自动化服务器启动。然后,生成的对象具有PutCharArrayPutWorkspaceData等方法,这些方法将常规.NET System.Array变量作为输入; Execute运行MATLAB命令;和GetFullMatrix等返回常规.NET System.Array变量作为输出。
  2. 使用附加产品MATLAB Builder for .NET,您可以将MATLAB代码部署到.NET程序集。然后,您可以从.NET调用该程序集,并且您部署的功能可用作方法。这些方法将MWCellArrayMWNumericArray等内容作为输入,并将它们作为输出返回。
  3. 您不能将这两者混合,例如,将MWCellArray传递给matlab.PutWorkspaceData

    如果您的目标是调用MATLAB的实时副本,请不要创建MWCellArray变量 - 只需使用PutCharArrayPutFullMatrix传递字符串和数组,执行内容,然后获取结果返回GetCharArrayGetFullMatrixHere是MATLAB文档中的一个例子。

    如果您的目标是调用已部署的.NET程序集,则将其实例化并调用它(传递MWCellArray等)而不是MLApp.MLAppHere是Builder for .NET doc的一个例子。

答案 1 :(得分:0)

将其另存为ascii文件,并将其同样加载到matlab中? ascii文件的格式看起来很简单:load documentation。现在的问题是如何从C#中保存为ascii,这对我来说似乎比原来的问题简单得多:)

唯一真正的格式要求是每行上的元素数量相等。当然,你只限于2d矩阵:(