【问题标题】:How to create a Mathematica Notebook in Java?如何在 Java 中创建 Mathematica 笔记本?
【发布时间】:2011-12-23 15:30:50
【问题描述】:

我正在寻找用于创建 Mathematica Notebook 文件的原型“Hello World”程序。

我有这个工作程序。

 package graphica;

 import com.wolfram.jlink.*;

 /**
  *
  * @author Nilo
  */
public class MathematicaTester {

public static void main(String[] args) {

    KernelLink ml = null; 
    String jLinkDir = "C:\\Program Files\\Wolfram Research\\Mathematica\\8.0\\SystemFiles\\Links\\JLink";
    System.setProperty("com.wolfram.jlink.libdir", jLinkDir);

    try { 
        ml = MathLinkFactory.createKernelLink("-linkmode launch -linkname 'C:\\Program Files\\Wolfram Research\\Mathematica\\8.0\\MathKernel.exe'");

        ml.discardAnswer();
        String expr = "Sum[k^2,{k,1,11}]";
        ml.evaluate(expr);
        ml.waitForAnswer();
        String x = ml.getString();
        System.out.println("Result = " + x);

    } catch (MathLinkException e) { 
        System.out.println("Fatal error opening link: " + 
        e.getMessage()); 
        return; 
    }
}
}

当我运行它时,我得到以下 -expected- 输出。

运行:
结果 = 506
构建成功(总时间:2 秒)

问题:

我想更改这个程序,以便创建 Mathematica Notebook。该程序将(最终)逐行添加 mma 命令字符串。如果同时启动 Mathematica 前端并且 mma 代码由 Java 程序的请求进行评估,那就太好了。本质是创建一个笔记本,以后可以由 mma 前端打开。

【问题讨论】:

  • 我对 Mathematica 不是很了解,但是如果 notebook 就像一个项目文件,你必须知道它的结构。如果它是二进制文件,你必须对其进行逆向工程......官方网站(或任何非官方网站)是否对此有任何说明?
  • @david - Mathematica - Java 集成基于 J/Link。我浏览了文档,但没有找到我需要的东西。 - 我想确保在开始黑客攻击之前我没有错过任何东西或者可以在这里获得 HelloWorld。
  • @niloderoock Mathematica 笔记本实际上是纯文本,因此您可以通过使用文本编辑器查看其底层结构。我帮不了你的 Java 位。
  • 我对 Java 了解不多,所以我会远离那个领域。但似乎您设法从 Java 评估内核中的任意表达式。创建笔记本对象的函数是CreateDocument[](然后您可以查看操作它的所有函数的文档,包括写入和保存)。现在要注意的是,这仅在存在前端时才有效。因此,您需要将其评估为UsingFrontEnd[nb = CreateDocument[]]。这将导致内核启动后台前端并使用它。使用命令行会话在 Win 上测试,希望它在 J 中有效
  • @niloderoock 感谢您发布代码。

标签: wolfram-mathematica jlink


【解决方案1】:

这里显示了一种创建格式化笔记本文件的方法:

How to create a notebook with a properly formatted expression

您可以使用内核调用框格式化您的 Mathematica 代码 (mathCommand),例如

String mathCommand = "Plot[Sin[x], {x, 0, 6}]";
mathCommand = "FullForm[ToBoxes[Defer[" + mathCommand + "]]]";
MathKernel kernel = new MathKernel();
kernel.Compute(mathCommand);
mathCommand = kernel.Result.ToString();

然后像这样封装,并以.nb扩展名保存。

Notebook[{Cell[BoxData[
... ( inserted box-formatted output ) ...
], "Input"]
},
WindowSize->{615, 750},
WindowMargins->{{328, Automatic}, {Automatic, 76}},
StyleDefinitions->"Default.nb"
]

【讨论】:

  • 看起来很有希望,我要试试这个。
  • 你测试过这个吗?显然,这个答案不是自包含的。
  • @nilo,我添加了MathKernel kernel = new MathKernel(); 除此之外,链接中的版本适用于C#。
  • 感谢@Chris,这解释了它,因为我使用的是 Java。我必须为 JLinkNativeLibrary 丢失错误以及 MGet 同步失败找到解决方案。现在我可以用 Mathematica 做一些事情,比如添加“1+1”。所以我还没有完全做到这一点,但我正在取得进展。 ;-)
【解决方案2】:

Mathematica 笔记本是具有类似

结构的纯文本文件
Notebook[{Cell[],Cell[]}]

您可以使用文本编辑器查看所需的结构。假设您可以让 Java 创建一个文本文件,以 .nb 文件名结尾保存它,并调用 Mathematica 的命令行版本,那么您想要的应该是可行的。您可能希望将输入单元格设置为初始化类型。

【讨论】:

    【解决方案3】:

    我进行了一些研究,但我设法自己回答了这个问题。

     package graphica;
    
     import com.wolfram.jlink.*;
    
     /**
      *
      * @author Nilo
      */
     public class MathematicaTester {
    
         public static void main(String[] args) {
    
             KernelLink ml = null; 
             String jLinkDir = "C:\\Program Files\\Wolfram Research\\Mathematica\\8.0\    \SystemFiles\\Links\\JLink";
             System.setProperty("com.wolfram.jlink.libdir", jLinkDir);
    
             try { 
                 ml = MathLinkFactory.createKernelLink("-linkmode launch -linkname 'C:\\Program Files\\Wolfram Research\\Mathematica\\8.0\\MathKernel.exe'");
            //test-1
                 ml.discardAnswer();
                 String expr = "Sum[k,{k,1,11}]";
                 ml.evaluate(expr);
                 ml.waitForAnswer();
                 String x = ml.getString();
                 System.out.println("Result = " + x);
           //test-2
                 expr = "UsingFrontEnd[nb=NotebookPut[Notebook[{Cell[\"Graphics3D[Cuboid[]]\", \"Input\"]}]]]";
                 System.out.println("Result = " + ml.evaluateToOutputForm(expr, 40) );
                 expr = "UsingFrontEnd[NotebookSave[nb,\"TERRANOVA1\"]]";
                 System.out.println("Result = " + ml.evaluateToOutputForm(expr, 40) );
    
             } catch (MathLinkException e) { 
                 System.out.println("Fatal error opening link: " + 
                 e.getMessage()); 
                 return; 
             }
         }
     }
    

    【讨论】:

      猜你喜欢
      • 2015-08-21
      • 2023-04-05
      • 2014-06-14
      • 2011-02-18
      • 1970-01-01
      • 2011-06-21
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多