“无效的卡勒”,而在C#中使用MLapp(“Invalid Calle” while using M

2019-10-19 05:11发布

我在同时使用奇怪的问题MLApp.GetWorkspaceData功能。 我注意到,这个功能的适当工作,如果我做到以下几点:

matlab = new MLApp.MLAppClass();

object myObject;

matlab.GetWorkspaceData("myVariable", "base", out myObject);

但是,如果我再尝试使用相同的对象作为输出我得到一个“无效被调用方”异常。 另外这也给了同样的错误:

matlab = new MLApp.MLAppClass();

object myObject = new object();

matlab.GetWorkspaceData("myVariable", "base", out myObject);

这是很麻烦的,因为我需要从MATLAB得到大量的数据到Visual Studio,我实际上不能创建52K未初始化的变量,并保持周围。 是否有某种方式为“未初始化”的变量? 有一些概念,我在这里失踪?

Answer 1:

正如@ wonko79在评论中解释说,如果你想重新使用out变量,你应该将其设置为null第一。

这里是一个测试例子从C#调用MATLAB :

using System;

namespace CSharp_matlab_com
{
class Program
{
    static void Main(string[] args)
    {
        MLApp.MLAppClass matlab = new MLApp.MLAppClass();

        // create variables: a_0, a_1, ..., a_4
        for (int k = 0; k < 5; k++) {
            matlab.Execute(string.Format("a_{0} = rand(2);", k));
        }

        // retrieve variables from MATLAB and print their contents
        object a;
        for (int k = 0; k < 5; k++) {
            // current variable name
            string varname = string.Format("a_{0}", k);

            // get data array
            a = null;    // without this line, an exception is thrown!
            matlab.GetWorkspaceData(varname, "base", out a);

            // print contents
            var arr = (double[,]) a;
            Console.WriteLine("\nndims(a) = {0}, numel(a) = {1}", arr.Rank, arr.Length);
            for (int i = 0; i < arr.GetLength(0); i++) {
                for (int j = 0; j < arr.GetLength(1); j++) {
                    Console.WriteLine("{0}[{1},{2}] = {3}", varname, i, j, arr[i,j]);
                }
            }
        }
    }
}
}

输出:

ndims(a) = 2, numel(a) = 4
a_0[0,0] = 0.251806122472313
a_0[0,1] = 0.617090884393223
a_0[1,0] = 0.290440664276979
a_0[1,1] = 0.265280909810029

...

ndims(a) = 2, numel(a) = 4
a_4[0,0] = 0.425259320214135
a_4[0,1] = 0.16148474431175
a_4[1,0] = 0.312718886820616
a_4[1,1] = 0.178766186752368


Answer 2:

您可以创建一个包装GetWorkspaceData方法,例如下面的例子:

public object GetData(string name)
{
    object data;
    mlApp.GetWorkspaceData(name, "base", out data);

    return data;
}

或者,更加有用,通用的包装:

public T GetData<T>(string name)
{
    object data;
    mlApp.GetWorkspaceData(name, "base", out data);

    if (data == null)
        return default(T);

    if (data is T)
        return (T)data;
    else
        throw new InvalidCastException($"The variable '{name}', of type '{data.GetType().Name}' cannot be casted to type '{typeof(T).Name}'.");
}


Answer 3:

解决的办法是设置输出对象null

我发现它在这里 。



文章来源: “Invalid Calle” while using MLapp in C#