小编jml*_*pez的帖子

指定选项的设置

如何明确说明选项的有效设置?以这个例子为例

Options[myFunc] = {opt1 -> "SomeString"};
myFunc[OptionsPattern[]] := Print[OptionValue[opt1]];
Run Code Online (Sandbox Code Playgroud)

myFunc打印选项的值.如果我们评估myFunc[opt1 -> {1, 2}]然后打印{1, 2}.此功能基本上可以打印您设置的任何内容opt1.我的问题是,我怎样才能确保我的函数只接受给定数量的值opt1.我们可以从像a String和a这样简单的东西开始Integer.

为了更好地了解在给出错误值时我们期望的行为,我们opt1可以看看当我们PlotRange在函数中给出错误的值时会发生什么Plot.

在此输入图像描述

在图片中给出的示例中,我故意为PlotRange选项提供了错误的值,并给了我一条消息,指定了特定选项的正确值类型.它似乎PlotRange最终取得了默认值,因此它返回了Graphics对象.

在简单的例子中,我们想要获得的是:

myFunc::sometag : Value of option opt1 -> `1` is not a string or integer.
Run Code Online (Sandbox Code Playgroud)

怎么做到这一点?

wolfram-mathematica

8
推荐指数
1
解决办法
144
查看次数

Mathematica和C/C++:交换数据

我想知道如何使用管道在Mathematica和C/C++ 之间交换数据.在Mathematica 教程中,它说"当你打开文件或管道时,Mathematica创建一个'流对象',指定与文件或管道相关的开放流".

我知道如何在C和Mathematica中创建文件,我可以让每个程序读取和写入它们.我还不知道怎么做的是如何通过管道将输出从C发送到另一个程序,更不用说如何从Mathematica中做到这一点.

这是一个函数,Mathematica将矩阵写入二进制文件以及读取以该格式编写的文件.

writeDoubleMatrix[obj_, fileName_] := Module[{file},
  file = OpenWrite[fileName, BinaryFormat -> True];
  BinaryWrite[file, Length@obj, "Integer32"];
  BinaryWrite[file, Length@obj[[1]], "Integer32"];
  BinaryWrite[file, Flatten[obj], "Real64"];
  Close[file]
 ]
readDoubleMatrix[fileName_] := Module[{file, obj, m, n},
  file = OpenRead[fileName, BinaryFormat -> True];
  m = BinaryRead[file, "Integer32"];
  n = BinaryRead[file, "Integer32"];
  obj = BinaryReadList[file, "Real64", m*n];
  Close[file];
  Partition[obj, n]
 ]
Run Code Online (Sandbox Code Playgroud)

第一个函数将2个整数写入文件(矩阵的大小)和矩阵的数据.我没有在这里进行任何错误检查,因此我假设要写入的数据是特定的形式{{r11, r12, ..., r1n}, ...., {rm1, rm2, ..., rmn}}.第二个函数将能够读取二进制文件并返回矩阵.

接下来是我的C程序.该程序将读取存储在文件MathematicaData.bin中的数据,将此矩阵乘以2并将数据写入另一个文件.

// genData.c
#include <stdlib.h>
#include <stdio.h>

int …
Run Code Online (Sandbox Code Playgroud)

c wolfram-mathematica

7
推荐指数
1
解决办法
2782
查看次数

Mathematica:MathLink错误消息

我想我开始理解如何将用C/C++编写的函数链接到Mathematica.我面临的问题是我不知道如何从我的C包装器向Mathematica发送错误消息.在谷歌搜索后,我找到了这个MathLink教程.

第1.7节给了我一个关于如何发送错误消息的见解,但我得到了奇怪的结果.这是我正在使用的代码.


//File cppFunctions.h
#ifndef CPPFUNCTIONS_H
#define CPPFUNCTIONS_H
class Point {
public:
    double x, y;
    Point(){ x=y=0.0;}
    Point(double a, double b): x(a), y(b) {}
};
class Line {
public:
    Point p1, p2;
    Line(void) {}
    Line(const Point &P, const Point &Q): p1(P), p2(Q) {}
    double distanceTo(const Line &M, const double &EPS = 0.000001){
        double x21 = p2.x - p1.x;     double y21 = p2.y - p1.y;
        double x43 = M.p2.x - M.p1.x; double y43 = M.p2.y - M.p1.y; …
Run Code Online (Sandbox Code Playgroud)

c++ wolfram-mathematica mathlink

7
推荐指数
1
解决办法
2410
查看次数

格式化使用消息

如果您查看Mathematica8中的Combinatorica包,您将找到函数的定义.我有兴趣知道的是Mathematica如何知道如何格式化使用信息.有些东西告诉我,我没有看正确的文件.无论如何,让我们尝试以下方法:(mathematicapath)/AddOns/LegacyPackages/DiscreteMath/Combinatorica.m

Cofactor::usage = "Cofactor[m, {i, j}] calculates the (i, j)th cofactor of matrix m."
Run Code Online (Sandbox Code Playgroud)

该行是上述文件中的682行.现在如果我们在mathematica笔记本中运行它并且我们使用,?Cofactor我们将看到完全相同的消息.但是如果我们得到包,那么消息就被格式化了.这是一个截图:

在此输入图像描述

注意函数中的m,i和j是如何变化的,并且在消息中添加了一个双箭头.我认为箭头已添加到邮件中,因为它存在文档.有人可以解释这种行为吗?


编辑:这是我的笔记本文件的屏幕截图,自动保存到m文件.

在此输入图像描述

正如你所看到的那样,L并且M在斜体时代是新的罗马.现在我将加载包并查看用法.

在此输入图像描述

到现在为止还挺好.现在让我们看一下文档中心.我会寻找这个功能LineDistance.

在此输入图像描述

如您所见,它显示了一个奇怪的消息.在这种情况下,我们只想显示没有任何样式的消息.我仍然无法弄清楚Combinatorica包是如何做到的.我按照这个来制作索引,以便doc中心可以显示摘要.摘要本质上是使用显示.如果我需要更具体,请告诉我.

wolfram-mathematica mathematica-8 usage-message

7
推荐指数
1
解决办法
649
查看次数

Mathematica:Graphics3D中相对于图像坐标的文本

Mathematica文档说明:"三维图形中的文本放置在与指定的点{x,y,z}的投影相对应的位置.文本在所有其他对象的前面绘制".如何相对于图像大小定位文本?

这是如何在2D中完成的:

custumLabels = Graphics[{
  Text[Style["A", Red, Bold, 18], ImageScaled[{0.025, .95}]], 
  Text[Style["B", Red, Bold, 18], ImageScaled[{0.95, .05}]]}
];
Framed[Show[
  Plot[
    Sin[x] Exp[x], {x, 0, 10},
    Frame -> True,
    PlotRangeClipping -> False,
    FrameLabel -> {"x", "y"}
  ],
  custumLabels
 ],
 FrameMargins -> 0]
Run Code Online (Sandbox Code Playgroud)

产量

只要PlotRangeClipping设置为,那些标签将始终出现在该位置False.问题是,如果我切换到,如何使这些标签出现在该特定位置Graphics3D.尝试简单一点.

Framed[Show[
  Graphics3D[{Sphere[{0, 0, 0}, 1]}]
 ],
 FrameMargins -> 0]
Run Code Online (Sandbox Code Playgroud)

plot wolfram-mathematica mathematica-8

6
推荐指数
1
解决办法
1573
查看次数

将单元格定义扩展到CellFrameLabels定义

我正在创建一个包含写入文档样式的笔记本.我希望Mathematica的行为类似于LaTeX,因为当我写一个"Definition"单元格然后它会写"Definition [Chapter#].[Definition#]".

要明白我的意思,请执行以下操作.在空白笔记本中创建一个单元格并将样式修改为"Chapter".您可以通过选择单元格并转到Format->Style->Other,输入来完成此操作"Chapter".

现在去Format->Edit StyleSheet....输入Chapter在输入框中.这将生成一个标记为Chapter的单元格.选择该单元格,然后单击Cell->Show Expression.此时选择您在那里看到的所有文本,并将其替换为以下内容:

Cell[StyleData["Chapter"],
 CellFrame->{{0, 0}, {0, 0}},
 ShowCellBracket->Automatic,
 CellMargins->{{42, 27}, {10, 30}},
 CounterIncrements->"Chapter",
 CounterAssignments->{{"Section", 0}, {"Definition", 0}},
 FontFamily->"Verdana",
 FontSize->24,
 FontWeight->"Bold",
 CellFrameLabels->{{
    Cell[
     TextData[{
       "Chapter ",
       CounterBox["Chapter"]
       }], "ChapterLabel", CellBaseline -> Baseline], Inherited}, {
   Inherited, Inherited}},
 FontColor->RGBColor[0.641154, 0.223011, 0.0623026]]
Run Code Online (Sandbox Code Playgroud)

这将改变章节单元格的显示方式.我改变了颜色和字体.对我来说最重要的是CellFrameLabels.注意到我已经做到了这一点,每次你创建一个章节单元格时它会显示:Chapter [Chapter Number].

章节

在上面的图片中,我创建了几个章节单元格,并添加了文本:": Title of Chapter #".

这很简单,我们可以创建任何单元格,应用定义并利用计数器的优势来标记单元格.

我注意到有些书的定义用方框括起来.所以在这种情况下我想创建一个包含的框Definition.这是我对细胞定义的蹩脚尝试"Definition".

Cell[StyleData["Definition"],
 CellFrame->{{0, …
Run Code Online (Sandbox Code Playgroud)

wolfram-mathematica

6
推荐指数
1
解决办法
400
查看次数

单个细胞的CounterIncrements

这篇文章源自我的问题,将细胞定义扩展到细胞框架标签.我一直在玩CounterIncrements,我没有得到我所期待的.

正如西蒙在回答我提到的帖子时所做的那样,我们首先要制作一个计数器.

CellPrint[Cell["Setting the counter", "Text", 
  CounterAssignments -> {{"MyCounter", 0}}]]
Run Code Online (Sandbox Code Playgroud)

现在我们打印这个柜台.

CellPrint[Cell[
  TextData[RowBox[{"MyCounter ", CounterBox["MyCounter"]}]], "Text"]]
Run Code Online (Sandbox Code Playgroud)

结果将是:

MyCounter 0
Run Code Online (Sandbox Code Playgroud)

要增加计数器,我们可以使用以下选项CounterIncrements:

CellPrint[Cell[TextData[RowBox[{"MyCounter ", CounterBox["MyCounter"]}]], 
 "Text", CounterIncrements -> "MyCounter"]]
Run Code Online (Sandbox Code Playgroud)

这会给你:

MyCounter 1
Run Code Online (Sandbox Code Playgroud)

您可以根据需要多次输入,您将看到计数器增加.

因为CounterIncrements是一个细胞的选项,我对自己说:"好吧,如果我在一个细胞内制作一个细胞并在那里设置这个选项怎么办?".由于我用这个选项制作一个单元格,我希望计数器能够增加.这会发生吗?

CellPrint[
 Cell[TextData[
   RowBox[{"MyCounter ", CounterBox["MyCounter"], 
    Cell[TextData[RowBox[{"[InlineCell]"}]], "Text", 
  CounterIncrements -> "MyCounter"]}]], "Text"]]
Run Code Online (Sandbox Code Playgroud)

输出是:

MyCounter 1[InlineCell]
Run Code Online (Sandbox Code Playgroud)

我期待输出是MyCounter 2[InlineCell]因为我告诉单元格内的单元格增加计数器,但它没有这样做.

该文件称CounterIncrements"尚未完全融入长期的Mathematica系统,并且可能会发生变化",但我认为信息存在一定的误导性.

我想要的原因是我可以定义一种每次使用时都会增加计数器的样式.但是这种风格将用于另一个细胞内的细胞.有人知道这里发生了什么吗?我在Mac OS X中使用MMA8.

wolfram-mathematica

6
推荐指数
1
解决办法
216
查看次数

在matlab中动态创建类

给定一个结构,有没有办法在MATLAB中创建一个类?举个例子

>> p = struct(); p.x = 0; p.y = 0;
>> p

p = 

    x: 0
    y: 0

>> name = 'Point'

name =

Point
Run Code Online (Sandbox Code Playgroud)

我想做的是,给出一个包含类名称的字符串和一个包含我想要创建类的字段的结构,而不必编写明确写入定义的文件.

现在,如果我们使用,class(p)我们将获得struct.我想要做的是创建一个类型的对象,Point这样当我这样做时,class(obj)我得到Point.

除了在MATLAB中使用类定义编写文件然后执行它之外,有什么想法可以实现这个目的吗?

oop matlab

6
推荐指数
1
解决办法
2322
查看次数

导出MMA8中断的一行图形对象

你如何使Mathematica导出Row图形.我不喜欢如何GraphicsRow处理图形,图中的所有宽高比和填充都搞砸了.我喜欢做的是处理每个人的形象,然后使用简单的Row,ColumnGrid结合我的数字.举个例子:

g1 = Plot[Sin[x], {x, -Pi, Pi}, 
      Frame -> True, FrameLabel -> {"x", "y"}, ImageSize -> 2.6*72
    ]
Run Code Online (Sandbox Code Playgroud)

这创造了Sin情节.我现在要做的是创建如下图:

Fig = Row[{g1, g1, g1}]
Run Code Online (Sandbox Code Playgroud)

产量

然后你可以使用 Export

Export["TestFig.pdf", Fig]
Run Code Online (Sandbox Code Playgroud)

这是我在MMA8中获得的pdf:

产量

我刚刚在MMA7中尝试了这个代码,它运行正常.已经有一段时间了,因为我想创建这种类型的数字,我从不打扰检查它是否在MMA8中有效.MMA8中有没有人对此有所解决?

所需的输出是我在MMA7中获得的输出:

期望的输出

wolfram-mathematica mathematica-8

6
推荐指数
1
解决办法
1651
查看次数

使用C++中的线程报告计算进度

我正在编写一个通用的抽象类,以便能够根据需要报告任意数量的实例变量的状态.例如,考虑以下无用循环:

int a, b;
for (int i=0; i < 10000; ++i) {
    for (int j=0; j < 1000; ++j) {
        for (int k =0; k < 1000; ++k) {
            a = i;
            b = j;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

能够看到ab不必修改循环的值是很好的.在过去,我写过if语句,如下所示:

int a, b;
for (int i=0; i < 10000; ++i) {
    for (int j=0; j < 1000; ++j) {
        for (int k =0; k < 1000; ++k) {
            a = i;
            b = j;
            if (a % …
Run Code Online (Sandbox Code Playgroud)

c++ unix pthreads

6
推荐指数
1
解决办法
547
查看次数