gpt4 book ai didi

c# - 如何在不链接的情况下从 .NET 使用命令行 Matlab?

转载 作者:太空宇宙 更新时间:2023-11-03 22:26:46 24 4
gpt4 key购买 nike

我终于发现了一种无需链接即可从 .NET 使用命令行 Matlab 的方法:

  1. 使用 David A. Zier 的“csmatio”dll 将变量从 .NET 写入 MAT 文件。

  2. 从 Matlab 中读取文件,对其进行处理并将结果保存到 MAT 文件中:

    var process = new Process()
    {
    StartInfo = new ProcessStartInfo()
    {
    FileName = MatlabExecutableFileName,
    Arguments = "-nodisplay " +
    "-nojvm " +
    " -r \"somecommands; " +
    "save FILENAME OUTPUTVARIABLES; " +
    "exit;\""
    }
    };
    process.Start();
  3. 最糟糕的部分:WAITING过程完成。

    天真的方法:

    process.WaitForExit();

    不起作用,因为 matlab 在新线程中生成主应用程序

    观察输出文件的变化是棘手的:

    new FileSystemWatcher(MatlabPath, fileName)
    .WaitForChanged(WatcherChangeTypes.All)

    因为这个类的错误而无法工作。

    当前工作代码更长:

    using (var watcher = new FileSystemWatcher(MatlabPath, fileName))
    {
    var wait = new EventWaitHandle(false, EventResetMode.AutoReset);
    watcher.EnableRaisingEvents = true;
    watcher.Changed += delegate(object sender, FileSystemEventArgs e)
    {
    wait.Set();
    };
    foreach(var i in Enumerable.Range(0, 2))
    {
    if (!wait.WaitOne(MillissecondsTimeout))
    {
    throw new TimeoutException();
    }
    }
    Thread.Sleep(1000);
    }

    但我担心最后一行代码。上面的代码块是为了避免它而写的,但我不知道还能做什么。这段时间在某些计算机上会太多,而在其他计算机上会太少。

解决方案

var previousProcesses = Process
.GetProcessesByName("Matlab")
.Select(a => a.Id)
.ToArray();
process.Start();
process.WaitForExit();
var currentProcess = Process
.GetProcessesByName("Matlab")
.Where(a => !previousProcesses.Contains(a.Id))
.First();
currentProcess.WaitForExit();

最佳答案

更好的选择是 matlab 的 -wait 标志。它告诉 matlab 启动器与主 matlab 进程一起终止。

关于c# - 如何在不链接的情况下从 .NET 使用命令行 Matlab?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1115028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com