如何从 Matlab 移植到 Headless Octave for Web

How to port from Matlab to Headless Octave for Web

我有一个我编写的 Matlab 应用程序,我想将其放在 AWS 服务器上 运行ning Octave 以通过网络公开提供服务。我从未使用过 Octave。

我读到“--no-window-system”将允许我 运行 无头,我知道我可以使用 "saveas(fig,FileName,format)" 来保存我的数字。我的问题是 plot() 和 histogram() 会在 Octave 中没有头的情况下工作吗?如果是这样,我该如何处理? (我希望这些数字转到我将在网页中引用的 gif 或 jpeg。)

TIA

理论上它应该按预期工作。

要牢记并尝试解决的问题包括:

  1. 如果您的环境不提供 X DISPLAY,则只有 gnuplot 图形工具包可用。如果您想 'fake' x 显示以允许您使用其他图形工具包(例如 graphics_toolkit('qt')),请考虑 运行ning octave via xvfb-运行,它模拟'dumb' x 服务器。 (即作为 xvfb-run octave 启动八度,参见 https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=805295)。

  2. 当您尝试绘制 'offscreen' 的东西时,OpenGl 偶尔会报错。如果您的图像默认设置为不可见,则可以解决此问题,这仍然允许它们打印而不必出现在屏幕上。为此,在绘制任何内容之前将 'root' 图形对象设置为不可见:

    set(0, 'defaultfigurevisible', 'off')
    

具体来说,您的代码可能如下所示:

gnuplot_toolkit('qt';)   # optional, if run via xvfb-run or the AWS supports an X Display
set(0, 'defaultfigurevisible', 'off');
h = plot( 1 : 10 );
saveas( h, 'out.png', 'png' ); # you can replace 'png' with 'gif' or 'jpg' etc.

我在 Ubuntu Mace OS 运行ning Mac 上下载并安装了 Octave。这部分是无缝且简单的。首先,我使用以下命令在 Mac 上使用 Matlab 在无头模式下测试了我的代码:

/Applications/MATLAB_R2018a.app/bin/matlab -nodisplay  -nosplash -nodesktop -r "run('mycode.m');quit;"

它生成了正确的输出,这是一个包含四个图形的图,保存为 jpeg 格式,一些分析文本保存到标准输出。

然后我切换到带有 Octave 的 Ubuntu 机器。这导致了多次失败。 Octave 缺少 Matlab 核心中的许多功能。就像 readtable() 一样,它读取一个 csv 文件。它还缺少 table 对象的概念。因此,我有点死在水里了。

互动版的Octave我打开看看有什么功效,plot不行。要制作 plot() 函数,我必须执行以下操作:

graphics_toolkit ("gnuplot");

Plot 然后工作得很好并且之后与 Matlab 非常一致,但是它缺少太多其他东西来移植我的项目而不需要相当大的努力和一个全新的代码分支。

综上所述,我认为 Octave 是一个非常好的工具,但我也认为它与 Matlab 2018a 有很大不同,几乎不可能互换使用这两者。

我打电话给 Mathworks,我的许可证允许我 运行 2 个副本,但我不知道的是它们不必在同一个 OS 上。所以我可以在我的数据服务器上安装一个 Linux 版本并继续在我的 Mac 上开发。问题解决了。谢谢 Mathworks。