5

C# メソッドから MATLAB コマンド ウィンドウに行を書きたいです。これは .NET コードです。

using System;

namespace SharpLab {
    public class Test {
        public void Run() {
            dynamic Matlab = Activator.CreateInstance(Type.GetTypeFromProgID("Matlab.Application"));
            Matlab.Execute("clc"); // This line does work.
            Matlab.Execute("disp('Hello world!')"); // This line does not work.
        }
    }
}

次に、ライブラリをロードし、クラス インスタンスを作成して、メソッドを実行します。これは MATLAB コードです。

disp('This message goes to the command window. Can .NET call clc?');
NET.addAssembly('SharpLab.dll');
Test = SharpLab.Test;
Test.Run();

これは実行され、コマンド ウィンドウは clc によってクリアされます。2 番目の呼び出し「Hello world!」は機能しません。

MATLAB コマンド ウィンドウで C# からメッセージを出力するにはどうすればよいですか?

編集: http://www.mathworks.nl/support/solutions/en/data/1-C9Y0IJ/index.html?product=SL&solut=にリンクするメッセージを受け取りました。このソリューションは、書き込まれたすべての情報を使用する変数に収集しますが、私が実行している実際の関数は、その間に多くのメッセージがあり、約 1 分間機能します。テキストの壁を投げる前に少し待つことは、私が望んでいることではありません。

4

2 に答える 2

3

.NET イベントを使用してイベントが発生したことをリスナーに通知し、MATLAB でイベント ハンドラーを登録して実際の印刷を行う方法はどうでしょうか。

以下は、10000 までのすべての素数を見つけるおもちゃの例です。まず、C# ライブラリを作成します。

MyClass.cs

using System;

namespace MyLibrary
{
    public class MyClass
    {
        // function that does some work and notify listeners of occurred events
        public void FindPrimes()
        {
            // Primes between 1 and 10000
            for (int i = 1; i < 10000; i++)
            {
                if (MyClass.isPrime(i))
                {
                    //System.Console.WriteLine(i);
                    onPrimeFound(i);
                }
            }
        }

        // helper function to determine if number is prime
        public static bool isPrime(int x)
        {
            if (x == 1) return false;
            if (x == 2) return true;
            for (int i = 2; i <= Math.Ceiling(Math.Sqrt(x)); i++)
            {
                if (x % i == 0) return false;
            }
            return true;
        }

        // event broadcasted
        public event EventHandler PrimeFound;
        protected void onPrimeFound(int x)
        {
            var handler = this.PrimeFound;
            if (handler != null)
            {
                handler(this, new PrimeEventArgs(x));
            }
        }
    }

    // event data passed to listeners
    public class PrimeEventArgs : EventArgs
    {
        public readonly int number;
        public PrimeEventArgs(int x)
        {
            this.number = x;
        }
    }
}

MATLAB

次に、MATLAB 内でクラス ライブラリを使用します。

>> NET.addAssembly('C:\path\to\MyLibrary.dll');
>> c = MyLibrary.MyClass();
>> lh = addlistener(c, 'PrimeFound', @(o,e) fprintf('Prime: %d\n', e.number));
>> c.FindPrimes()
Prime: 2
Prime: 3
Prime: 5
...
Prime: 9973

C# 関数FindPrimes()は時間のかかる操作を実行し、イベントを発行して、関心のあるオブザーバーに発生したイベントを知らせます (基本的に、MATLAB コンソールに何かを出力したいときはいつでも)。バッファリングせずにすぐに印刷する必要があります。

于 2013-10-08T23:00:49.287 に答える
1

簡単な検索で、dll から出力を取得するには 2 つの方法があると思いました。

  1. ファイルに書き込んでから調べる
  2. コンソールが作成されていることを確認してから、コンソールにリンクします

最初の方法が最も簡単な方法だと思いますが、おそらく 2 番目の方法が必要です。

関連する部分を特定する (したがって抽出する) のは難しいですが、オプション 2 は here で説明されていると思います。

于 2013-10-07T08:39:28.040 に答える