让我们说,为了论证,我有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文件,然后加载它? (装载很容易,省钱让我难过)
我会对您提供的任何见解感兴趣。感谢。
答案 0 :(得分:3)
我认为你可能会混淆MATLAB和.NET之间的两种类型的交互。
MLApp.MLApp
将MATLAB的实时副本作为COM自动化服务器启动。然后,生成的对象具有PutCharArray
,PutWorkspaceData
等方法,这些方法将常规.NET System.Array
变量作为输入; Execute
运行MATLAB命令;和GetFullMatrix
等返回常规.NET System.Array
变量作为输出。MWCellArray
,MWNumericArray
等内容作为输入,并将它们作为输出返回。您不能将这两者混合,例如,将MWCellArray
传递给matlab.PutWorkspaceData
。
如果您的目标是调用MATLAB的实时副本,请不要创建MWCellArray
变量 - 只需使用PutCharArray
和PutFullMatrix
传递字符串和数组,执行内容,然后获取结果返回GetCharArray
和GetFullMatrix
。 Here是MATLAB文档中的一个例子。
如果您的目标是调用已部署的.NET程序集,则将其实例化并调用它(传递MWCellArray
等)而不是MLApp.MLApp
。 Here是Builder for .NET doc的一个例子。
答案 1 :(得分:0)
将其另存为ascii文件,并将其同样加载到matlab中? ascii文件的格式看起来很简单:load documentation。现在的问题是如何从C#中保存为ascii,这对我来说似乎比原来的问题简单得多:)
唯一真正的格式要求是每行上的元素数量相等。当然,你只限于2d矩阵:(