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 清除。第二个电话“Hello world!”不起作用。

如何在 MATLAB 命令窗口中从 C# 打印消息?

编辑:我收到一条链接到http://www.mathworks.nl/support/solutions/en/data/1-C9Y0IJ/index.html?product=SL&solut=的消息。该解决方案将所有书面信息收集到一个变量中以供使用,但是我正在运行的真正功能确实可以工作大约一分钟,中间有很多消息。在扔文字墙之前等待一分钟不是我想要的。

4

2 回答 2

3

如何使用.NET 事件通知侦听器发生了事件,您在 MATLAB 中注册事件处理程序以进行实际打印。

下面是一个玩具示例,它可以找到最大为 10000 的所有素数。首先我们创建 C# 库:

我的类.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 中获取输出。

  1. 将其写入文件,然后查看
  2. 确保创建了一个控制台,然后链接到它

我认为第一个是最简单的方法,但第二个可能是你需要的。

我很难确定(并因此提取)相关部分,但我相信这里描述了选项二

于 2013-10-07T08:39:28.040 回答