2016-05-08 11 views
2

私は、センサからTCP上でリアルタイムの(そしてたくさんの)データを受け取る.net DLL(C#)を持っています。データはカスタムオブジェクトの配列として出力されます。 (これをSensorPacketと呼びます。SensorPacketは、約20個のフィールドがあり、ほとんどがfloatとintです)。返信構造体.net dll(C#)

私はイベントを介してこれをmatlabに送信しています(うまく動作します)。しかし、Matlabはそれらを.NETオブジェクトの配列として見ています。私は構造体の配列としてこれを送信することを好むでしょう。どうやって?

はい、1は介して細胞アレイにこの配列を変換することができます:

http://www.mathworks.com/help/matlab/matlab_external/net-arrays-to-cell-arrays.html

それでも.NETオブジェクトのセル配列としてこれを残しています。私は値を取得できるようにオブジェクトをキャストできますか?

より良い構造体のセル/配列を送信することです。

私はJSONにこれを変換すると、構造体に変換し、MATLAB JSONリーダーを使用しようとしたが、これは非常に非常に遅いです: http://www.mathworks.com/matlabcentral/fileexchange/33381-jsonlab--a-toolbox-to-encode-decode-json-files

笑ってはいけない、私はDLLへの使用を考えています.MATファイルを書いてから、そのハンドルをMatlabに送ります。このライターはうまくいくかもしれない:まあ、それが表示され、次のページでhttp://www.mathworks.com/matlabcentral/fileexchange/16319-csmatio--mat-file-i-o-api-for-net-2-0

を、それは私が構造体やクラスを返すことができると言いますが、私の経験では、これがSystem.Objectの

http://www.mathworks.com/help/matlab/matlab_external/handling-net-data-in-matlab_bte9owt-1.html

答えて

0

を返すということですプレーンCのmexファイルとは異なり、matlabのネイティブな構造体とオブジェクトを返すことはできません。しかし、あなたが定義したクラスのC#オブジェクトを返すことができ、Matlabからプロパティにアクセスすることができます(単にプロパティ(netObj)を実行すれば表示されます)。

私の場合は、SingnalR経由でJSONメッセージを取得して、それらをExpandDoオブジェクトに変換してから個々のクラスオブジェクトを作成していますが、 MATLABにEVENTSを送信すると、MATLABはJSONを解析するよりも20倍高速ですが、実際のバルク作業ではまだ少し遅いですが、今はcsmatioツール(https://sourceforge.net/projects/csmatio)を使用して.MATファイル私はMatlabにデータが準備されていることを伝えます。

しかし、私のC#私はそれをやっている方法のコードを書いています(.NETイベントを作成することができます).MatlabイベントのようにMatlabに表示され、値を引数として渡します!私はmatlabがデータを処理している間、スレッドを.NETのスレッドがハングしないようにするためにtask.invokeを実行します。

public delegate void PostPerson(Portal sender, dynamic e); 
    public event PostPerson Post; 

     private void deliver(dynamic packet) 
    { 
     var converter = new ExpandoObjectConverter(); 
     dynamic data = JsonConvert.DeserializeObject<ExpandoObject>(packet.ToString(), converter); 
     dynamic mail; 
     String channelName = (string)data.Channel; 
     switch (channelName) 
     { 
      case "Oxford": 
       mail = new Oxford(data); 
       break; 
      case "RADAR": 
       mail = new Radar(data); 
       break; 
      case "SVSRear": 
       mail = new SVS(data); 
       break; 
      case "SVSFront": 
       mail = new SVS(data); 
       break; 
      case "IBEO": 
       mail = new IBEO(data); 
       break; 
      case "Fusion": 
       mail = new Fusion(data); 
       break; 
      default: 
       postFail(String.Format("Portal: deliver: Unknown Channel: {0}", channelName)); 
       return; 
     } 
     trigger(mail); 
    } 
    private void trigger(dynamic e) 
    { 
     if (Post != null) 
     { 
      //Post(this, e); 
      Task.Factory.StartNew(() => { Post(this, e); }); 
     } 
    } 
関連する問題