Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wolfram mathematica 如何用Java创建Mathematica笔记本?_Wolfram Mathematica_Jlink - Fatal编程技术网

Wolfram mathematica 如何用Java创建Mathematica笔记本?

Wolfram mathematica 如何用Java创建Mathematica笔记本?,wolfram-mathematica,jlink,Wolfram Mathematica,Jlink,我正在寻找创建Mathematica笔记本文件的原型“Hello World”程序 我有这个工作计划 package graphica; import com.wolfram.jlink.*; /** * * @author Nilo */ public class MathematicaTester { public static void main(String[] args) { KernelLink ml = null; String jLin

我正在寻找创建Mathematica笔记本文件的原型“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; 
    }
}
}
当我运行这个程序时,我得到了以下预期的输出

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

问题:


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

Mathematica笔记本是具有如下结构的纯文本文件

Notebook[{Cell[],Cell[]}]

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

创建格式化笔记本文件的方法如下所示:

您可以使用内核调用框格式化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"
]

这需要一些研究,但我自己设法回答了这个问题

 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; 
         }
     }
 }

我对Mathematica不太了解,但是如果笔记本就像一个项目文件,你必须知道它的结构。如果它是二进制的,你必须对它进行反向工程。。。官方网站(或任何非官方网站)对此有何评论?@david-Mathematica-Java集成基于J/Link。我浏览了文件,但没有找到我需要的在我开始黑客攻击之前,我想确保我没有错过任何东西,或者可以在这里找到HelloWorld。@Niloderook Mathematica笔记本实际上是纯文本的,因此您可以通过文本编辑器查看其基本结构。Java方面我帮不了你。我对Java知之甚少,所以我不会涉足这个领域。但是,您似乎成功地从Java计算了内核中的任意表达式。创建笔记本对象的函数是
CreateDocument[]
(然后您可以看到所有操作笔记本对象的函数的文档,包括写入和保存笔记本对象)。现在的问题是,只有在前端存在的情况下,这才有效。因此,您需要使用前端[nb=CreateDocument[]对其进行评估。这将导致内核启动后台前端并使用它。使用命令行会话在Win上进行测试,希望在J@niloderoock谢谢你发布代码。看起来很有希望,我要试试这个。你测试过这个吗?显然,这个答案不是自含的。@nilo,我添加了
MathKernel=new MathKernel()除此之外,链接中的版本在C#上工作。谢谢@Chris,这就解释了它,因为我使用的是Java。我必须为JLinkNativeLibrary丢失错误以及MGet同步失败找到解决方案。现在我可以用Mathematica做一些事情,比如加上“1+1”。因此,我还没有完全做到这一点,但我正在取得进展