运行 m 文件后,如何退出 GNU Octave,而不关闭绘图窗口?

2024-04-20

我一直在编写一个 C++ 程序来解决单摆问题,然后使用 GNU Octave 绘制结果。它通过我的程序中的这一行绘制结果:

system("./simppenadj.sh");

where simppenadj.sh is:

#!/bin/sh
octave --no-gui --persist -q simppenadj.m

and simppenadj.m is:

#!/usr/bin/octave
# Plotting simppenadj.txt
A      = importdata('simppenadj.txt');
B      = importdata('simppenadjdx.txt');
t      = A(:,1);
theta  = A(:,2);
dtheta = B(:,2);
figure
plot(t,theta)
xlabel('t','FontSize',16,'FontWeight','bold')
ylabel('\theta','FontSize',16,'FontWeight','bold')
title('{d^{2}\theta}/{d{t^{2}}} = -9.8 cos({\theta})','FontSize',18,'FontWeight','bold')
figure
plot(theta,dtheta)
xlabel('\theta','FontSize',16,'FontWeight','bold')
ylabel('d\theta/dt','FontSize',16,'FontWeight','bold')
title('{d^{2}\theta}/{d{t^{2}}} = -9.8 cos({\theta})','FontSize',18,'FontWeight','bold')

每当我运行 C++ 程序时,GNU Octave 的 CLI 都会启动(并在最后保持打开状态)并绘制数据。我不希望 GNU Octave 的 CLI 保持打开状态,但我知道如何让它不打开的唯一方法是删除--persist选项中simppenadj.sh这也使得 GNU Octave 生成​​的图不会保持打开状态。这是一个问题,因为我希望在运行 C++ 程序后使绘图保持打开状态。那么有没有办法做到这一点呢?


您可以使用 Octave API 从程序中调用脚本。在那里,创建一个子进程,它调用octave,以便父进程可以结束。这样,您就可以保持八度运行。使用此方法,没有 Octave CLI,因为您通过 API 进行所有对 Octave 的调用,尤其是feval.

不幸的是,关于使用 API 的指南非常糟糕,但我为你整理了一些应该有用的东西。它基本上只是读取一个脚本并执行相应的函数。这是此方法的好处:您可以使用正常的八度函数/脚本文件方法编写所有内容。

我添加了printfOctave 文件中的语句,以展示如何将参数传递给 Octave。

main.cpp

#include <iostream>

#include <unistd.h>

#include <octave/oct.h>
#include <octave/octave.h>
#include <octave/parse.h>
#include <octave/toplev.h>

int main()
{
    pid_t pid = fork();

    if(pid != 0) // parent
    {
        std::cout << "parent, exiting\n";
    }
    else
    {
        // arguments for octave
        string_vector argv (2);
        argv(0) = "embedded";
        argv(1) = "-q"; // quiet

        // start octave, run embedded (third parameter == true)
        octave_main (2, argv.c_str_vec (), true);

        // read the script file
        source_file("calc_and_plot.m");

        // call the function with an argument
        octave_value_list in;
        in(0) = "Hello, world.";
        feval("calc_and_plot", in);


        std::cout << "octave (child process) done\n";
        clean_up_and_exit(0); // quit octave. This also quits the program,
                              // so use this together with atexit, if you 
                              // need to do something else after octave exits
    }

    return 0;
}

八度脚本/函数文件

function calc_and_plot(str)
    printf('%s\n', str);
    x = linspace(0, 2*pi, 100);
    y = sin(x);
    it = plot(y);
    waitfor(it);
end

编译main.cpp

g++ main.cpp -L/usr/lib/octave-4.0.2 -I/usr/include/octave-4.0.2 -loctave -loctinterp

您必须调整系统和八度版本的路径。您还可以使用mkoctfile命令,其作用基本上相同。你可以看看它的输出-p开关,例如

mkoctfile -p CFLAGS

获取库、编译器标志等。请查看联机帮助页。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

运行 m 文件后,如何退出 GNU Octave,而不关闭绘图窗口? 的相关文章

随机推荐

  • 如何从 JPEG 中裁剪多个矩形或正方形?

    我有一个 jpeg 我想从其中裁剪包含图形的部分 底部的部分 截至目前 我使用此代码来实现相同的目的 from PIL import Image img Image open r D aakash graph2 jpg area 20 32
  • 如何跳转到 vim 中不同选项卡内的标记?

    我使用 MacVim 通常会打开许多 选项卡 我希望能够在任何打开的文件中放置标记并在它们之间跳转 mK and K当标记位于同一个选项卡中时效果很好 但我必须使用gt找到选项卡 然后K找到标记 一定有更好的方法吗 这是一个快速而肮脏的技巧
  • WPF 文本框插入符消失

    我正在开发一个 WPF 应用程序TextBox成分 我的文本框插入符有问题 看来 取决于地点TextBox插入符号本身在某些特定位置消失 插入符号显示 插入符号消失 插入符返回 The TextBox风格很简单
  • 如何将 GPS 数据从 Android 发送到网站?

    我是 Android 和 Web 服务开发新手 目前我正在开发Android程序 该程序将发送经度和纬度信息到asp net网站 以显示位置更改网站地图 问题是 如何将此数据发送到网站 最佳实践 对合适框架的任何建议 从Android应用程
  • 如何将三个列表压缩到嵌套字典中

    我有三个清单 z1 A A B B z2 k1 k2 k1 k2 z3 v1 v2 v3 v4 当我写时 print dict zip z2 z3 这是我的输出 k2 v4 k1 v3 我期望这样 A k1 v1 k2 v2 B k1 v3
  • 为什么 for(var i in Math) 不迭代 Javascript 中的 Math.* ?

    由于某种原因 for var i in Math console log i 没有显示 Javascript 中预期的 tan cos atan2 E PI Because Math是一个内置对象 其属性已标记不可枚举 许多内置对象都有这种
  • 我可以使用 Meteor 将 this._id 值从一个模板助手传递到另一个模板助手吗?

    我有以下模板 html 及其受人尊敬的管理器 js 文件 admin管理类别 管理员添加类别 管理更新类别 考虑以下
  • 将 pubnub 添加到 angular2 cli 项目

    我想将 PubNub 添加到 angular2 cli 项目中 问题出在链接上 但是 我按照 npmjs com 上 pubnub angular2 包的说明进行操作 当我尝试在浏览器中加载它时 错误消息是这样的 例外 PubNub 不在全
  • 在 Epson TM-T88IVM 上打印简体汉字

    我正在尝试使用 C 中的 Microsoft 服务点 SDK 在 Epson TM T88IV M 并行端口 上打印中文字符 但是 它们在打印机上显示为问号 我的 PosPrinter 具有以下有效的 CharacterSetList 25
  • SQL Not Like 语句不起作用

    我在存储过程中有以下代码 WHERE WPP ACCEPTED 1 AND WPI EMAIL LIKE MATH UCLA EDU AND WPP SPEAKER 0 OR WPP SPEAKER IS NULL AND WPP COMM
  • 尝试在 getline 中使用 int

    cout lt lt How many questions are there going to be on this exam lt lt endl cout lt lt gt gt getline cin totalquestions
  • android webservice响应“解析xml到pojo异常”

    我正在尝试访问 android 中的肥皂网络服务 AndroidHttpTransport httpTransport new AndroidHttpTransport URL String result String httpTransp
  • Linux cp 与正则表达式

    我想复制目录中的一些文件 重命名文件但保留扩展名 这可以通过简单的cp 使用正则表达式 例如 cp myfile mydir newname 1 所以我可以复制保留扩展名的文件 但重命名它 有没有办法获得匹配的元素cp正则表达式在命令中使用
  • 带光谱测试的电子应用程序的简单示例

    我正在尝试学习如何测试应用程序 使用电子构建 使用 Spectron 为此 我从网上获取了一个示例应用程序 其中包含简单的标题 计数器标签和增量按钮 我使用摩卡作为测试运行 测试应启动应用程序 按下按钮并检查计数器标签 我什至无法达到应用程
  • 如何在 SQL 中比较两列?

    假设我有两个表 每个表都有一个 SSN 变量 我想显示仅在一个表中的表 而不是两个表中的表 这样做的正确方法是什么 这是一种方法 select coalesce t1 ssn t2 ssn from t1 full outer join t
  • 调用 SKLabelNode 时出现延迟?

    我在从一个版本转换时遇到了轻微延迟 滞后 的问题SKScene到另一个 通过注释掉各种代码 我将其范围缩小到SKLabelNode 我的猜测是 这就是它在调用时加载 缓存字体 这会导致在声明新字体时出现小的延迟 口吃SKScene 有没有其
  • 我可以将自定义注释参数传递给 Spring EL 表达式吗?

    我有自定义注释 例如 AllowedForUserWithID public myFunction int userID PreAuthorize CustomPermissionEvaluator isUserWithID princip
  • 无法将 bootstrap 4(测试版)nuget 包安装到 .Net MVC(.Net 版本 4.6.2)

    我无法将 bootstrap 4 测试版 安装到我的 MVC 项目中 准确地说 popper js nuget 依赖项无法安装 请让我知道任何可能的方法 bower install 仍然是一种方法 但我想使用 nuget 无法安装包 pop
  • iOS 颜色与图案 - 使用自定义 iPhone 5 图像

    对于我的应用程序的加载屏幕和启动屏幕 我使用了两种不同的方法来正确显示我的 iPhone 3 iPhone 4 和 iPhone 5 图像 对于加载屏幕 只需在图像中添加 568h 2x 就足以支持 iPhone5 对于闪屏 我使用了一系列
  • 运行 m 文件后,如何退出 GNU Octave,而不关闭绘图窗口?

    我一直在编写一个 C 程序来解决单摆问题 然后使用 GNU Octave 绘制结果 它通过我的程序中的这一行绘制结果 system simppenadj sh where simppenadj sh is bin sh octave no