2014-01-14 24 views
0

我在使用MLApp.GetWorkspaceData函數時出現了一個奇怪的問題。我注意到,這個功能的適當工作,如果我做到以下幾點:在C#中使用MLapp時出現「無效的Calle」#

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未初始化的變量,並保持周圍。有什麼方法可以「初始化」一個變量嗎?我在這裏錯過了一些概念嗎?

+1

您可以設置'myObject = null;'和垃圾收集器應該在某個時間點完成剩下的工作。 – wonko79

+0

Wonko,那真的似乎工作。但我仍然不知道到底發生了什麼。爲什麼不能分配給「新」變量?爲什麼它必須是未初始化的? – Cashomoto

+0

由於您正在通過COM包裝器調用Mathlab,它可能與處理過程中的某些事情無法改變其他類似的東西或類似的東西。 – wonko79

回答

1

由於@wonko79在註釋中解釋,如果您想重複使用out變量,應首先將其設置爲null

這裏是一個測試例子calling MATLAB from C#

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 
0

可以創建一個包裝爲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}'."); 
} 
相關問題