0

让我们说,为了争论,我有 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 文件然后加载它?(加载很容易,保存让我难过)

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

4

2 回答 2

3

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

  1. 您可以使用MLApp.MLApp. 然后生成的对象具有诸如 等的方法PutCharArrayPutWorkspaceData这些方法将常规 .NETSystem.Array变量作为输入;Execute运行 MATLAB 命令;等等GetFullMatrix,它们返回常规的 .NETSystem.Array变量作为输出。
  2. 使用附加产品MATLAB Builder for .NET,您可以将 MATLAB 代码部署到 .NET 程序集。然后,您可以从 .NET 调用该程序集,并且您部署的函数可作为方法使用。这些方法将诸如MWCellArrayMWNumericArray作为输入,并将它们作为输出返回。

例如,您不能通过传递 a MWCellArrayto 来混合这两者matlab.PutWorkspaceData

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

如果您的目标是调用已部署的 .NET 程序集,则实例化它并调用它(传递MWCellArray等)而不是MLApp.MLApp. 下面是 Builder for .NET 文档中的一个示例。

于 2012-05-11T12:51:52.477 回答
0

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

唯一真正的格式要求是每行上的元素数量相等。当然,您只能以这种方式使用 2d 矩阵:(

于 2012-05-11T12:01:37.973 回答