![]() |
如何在不链接的情况下从.NET使用命令行Matlab?
我终于找到了一种无需链接即可使用.NET命令行Matlab的方法:
[LIST=1][*]使用David A. Zier的“ csmatio” dll将变量从.NET写入MAT文件。 [*]从Matlab中读取文件,对其进行处理并将结果保存到MAT文件中: var process = new Process() { StartInfo = new ProcessStartInfo() { FileName = MatlabExecutableFileName, Arguments = "-nodisplay " + "-nojvm " + " -r \"somecommands; " + "save FILENAME OUTPUTVARIABLES; " + "exit;\"" } }; process.Start();[*] [B]最糟糕的部分:[/B]等到过程完成。 天真的方法: 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); } 但是我担心最后一行代码。上面的代码块是为了避免这种情况而编写的,但是我不知道该怎么办。在某些计算机上,此时间量将太多,而在其他计算机上,该时间量将太少。 [/LIST][B]解[/B] 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过程中终止。 [url=https://stackoverflow.com/questions/1115028]更多&回答...[/url] |
所有时间均为北京时间。现在的时间是 23:24。 |
Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.