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 の MWCellArray であり、この変換には 15 ~ 20 分かかります。

そう。どうすればこれを賢明な方法で行うことができますか?転送を有効にする他の方法が見つかりません。matlab.PutCharArray も matlab.PutFullMatrix も適用できないようです。

ループを大幅に高速化する方法はありますか? 私はc#にまったく慣れていません

あるいは、MWCellArray を .mat ファイルとして C ドライブに保存してからロードできるはずだと思っていたでしょうか? (読み込みは簡単ですが、保存には困惑しています)

あなたが提供できる洞察に興味があります。ありがとう。

4

2 に答える 2

3

MATLAB と .NET の間の 2 種類の相互作用を混同していると思います。

  1. を使用して、MATLAB のライブ コピーを COM オートメーション サーバーとして開始できますMLApp.MLApp。結果のオブジェクトにはPutCharArrayPutWorkspaceDataなどのメソッドがあり、通常の .NETSystem.Array変数を入力として受け取ります。ExecuteMATLAB コマンドを実行します。GetFullMatrix出力として通常の .NETSystem.Array変数を返すなど。
  2. アドオン製品のMATLAB Builder for .NETを使用すると、MATLAB コードを .NET アセンブリに配布できます。その後、そのアセンブリを .NET から呼び出すことができます。デプロイした関数はメソッドとして使用できます。これらのメソッドはMWCellArrayMWNumericArrayなどを入力として受け取り、それらを出力として返します。

たとえば、 aMWCellArrayを toに渡して、これら 2 つを混在させることはできませんmatlab.PutWorkspaceData

MATLAB のライブ コピーを呼び出すことが目的の場合は、変数を作成しないでください。文字列と配列をandMWCellArrayで渡し、ものを実行してから、 andで結果を取得します。MATLAB doc の例を次に示しますPutCharArrayPutFullMatrixGetCharArrayGetFullMatrix

デプロイされた .NET アセンブリを呼び出すことが目的の場合は、.NET アセンブリではMWCellArrayなく、それをインスタンス化して呼び出します (渡すなど) MLApp.MLApp。Builder for .NET ドキュメントの例を次に示します

于 2012-05-11T12:51:52.477 に答える
0

asciiファイルとして保存し、同様にmatlabにロードしますか? ascii ファイルの形式は非常に単純に見えます: load documentation . 現在の問題は、C# から ascii として保存する方法です。これは、元の問題よりも少し単純に思えます :)

唯一の実際の形式要件は、各行の要素数が等しいことです。もちろん、この方法では2次元行列に制限されています:(

于 2012-05-11T12:01:37.973 に答える