我主要使用mathematica作为数学工作台,并编写相对较小的ad-hoc程序.然而,我正在设计一个我打算在Mathematica中编程的系统.我需要将数据存储在树中,并搜索和遍历树.虽然我知道如何实现树,但我更喜欢标准的,经过测试的代码.我在Mathematica用户维基上查看了基本数据结构的类型.我没有找到,尽管Mathematica文档中有一个小例子.
现在问我的问题:
是否有可用的数据结构(开源)包?
您在数据结构方面使用了什么方法?逐步开发自己的util包?
(这不是一个问题,只是一个评论.也许......缺乏(大量可用的)开源软件包是Mathematica没有应有的动力的原因.我害怕鸡/蛋问题.)
我想描述我一直有一个问题与Plot使用With,以保持定义的参数"本地".我不一定要求解决问题:我遇到的问题是理解问题.
有时候我使用如下的结构来获得一个Plot:
方法1
plot1 = With[{vmax = 10, km = 10},
Plot[Evaluate@((vmax x)/(km + x)), {x, 0, 100},
AxesOrigin -> {0, 0}]]
Run Code Online (Sandbox Code Playgroud)
我喜欢这种方法,即使对于非Mathematica用户来说,它也是相当清楚的.
当要绘制的方程式变得更加复杂时,我喜欢在绘图外部定义它们(使用SetDelayed).例如:
f[x_] := (vmax x)/(km + x)
Run Code Online (Sandbox Code Playgroud)
但是,以下不起作用
方法2
plot2 = With[{vmax = 10, km = 10},
Plot[Evaluate@f[x], {x, 0, 100}, AxesOrigin -> {0, 0}]]
Run Code Online (Sandbox Code Playgroud)
我一直天真地认为它应该.但是,基于Help语句
Plot将变量x视为本地,有效地使用Block
我使用过各种解决方法,大多数情况如下
方法3
plot3 = Plot[With[{vmax = 10, km = 10}, Evaluate@f[x]], {x, 0, 100},
AxesOrigin -> {0, 0}]
Run Code Online (Sandbox Code Playgroud)
这个看起来很尴尬,甚至通常需要对Mathematica用户进一步解释.
绘图输出

但是,最近我发现偶然的机会,取代 …
在使用Mathematica的符号和数字功能之后,我发现它也是一种不错的编程语言.但是,作为通用语言使其不那么吸引人的东西是缺少类似C的结构数据类型(或Pascal中已知的记录类型).我怎样才能解决这个问题?
我想知道如何一般地做到这一点,最好的策略是什么等等.我已经看到了一些解决方案,其中一些看起来非常难/乏味.我工作的那个使用纯函数来实现对象函数和头像OBJECT [].在类编码方面使用起来非常困难.在定义函数和构造函数时(特别是继承部分很难),我感到头晕目眩.
因此,我的问题的编码是关于类的编码部分的优点.理想情况下,我正在寻找可以如下工作的东西.首先,我们定义一个类,例如汽车如下:
beginClass["vehicle"];
public startTheEngine;
private fuel;
vehicle[args_]:=Block[{},...];
startTheEngine[thrust_]:=Block[{}...];
endClass
beginClass["car", "vehicle"];
public TurnTheRadioOn;
private frequency;
car[args_] := Block[{...},];
TurnTheRadioOn[]:=
Block[{},
use private variable frequency
]
endClass;
Run Code Online (Sandbox Code Playgroud)
请注意,私有/公共函数的定义几乎与"普通"mathematica代码一样非常重要.这就是主要要求.
该课程将被用作
car1 = newObject["car", args];
car1.StartTheEngine[];
car1.TurnOnTheRadio[];
Run Code Online (Sandbox Code Playgroud)
我很好奇那个人要考虑什么?为了构建像上面这样的东西可能涉及Mathematica的许多方面,例如如何修复".".语法等.如果您建议现有的软件包,我将不胜感激,如果您可以原则上评论它是如何工作的.
我天真的期望是封装部分可以通过BeginPackage结构修复.所有对象都可以存储在专门为每个类设计的名称空间中.我认为对象看起来像
car1 = OBJECT["car"][fuel$1,frequency$1,....];
car2 = OBJECT["car"][fuel$2,frequency$2,....];
Run Code Online (Sandbox Code Playgroud)
我认为必须构建类似编译器的东西,将上面的类定义代码转换为类.m文件.此外,在某种程度上,第二个主要问题是如何构建这样的编译器.
关心佐兰
ps我之所以问这个问题,是因为我真的需要多次这样的东西.
我不确定如何初始化Mathematica中的结构以与Manipulate一起使用,以帮助我更好地组织我拥有的许多控制变量.
我将举几个例子,这有助于说明问题.
这是最基本的操作:
方法1
Clear["Global`*"]
Manipulate[process[a, b],
{{a, 1, "a"}, -10, 10, 1},
{{b, 2, "b"}, -10, 10, 1},
Initialization :>
{
process[a_, b_] := Module[{}, Row[{"a=", a, " b=", b}]]
}
]
Run Code Online (Sandbox Code Playgroud)
在我写的一个演示中,我有更多的控件.一些函数(例如上面名为process []的函数)最终必须使用15个或更多参数调用,这使得我很难维护.(我别无选择,不能真正考虑它).
所以,我正在尝试使用结构来收集这些变量.相关问题是这样的
所以,接下来我尝试了下面的内容:(我知道在Mathematica中制作结构的选择不是最好的,但我想先看看它是否可行)
方法2
Clear["Global`*"]
Manipulate[process[myData],
{{myData["a"], 1, "a"}, -10, 10, 1},
{{myData["b"], 1, "b"}, -10, 10, 1},
Initialization :>
{
process[myData_] :=
Module[{}, Row[{"a=", myData["a"], " b=", myData["b"]}]]
}
]
Run Code Online (Sandbox Code Playgroud)
但上述方法无效.我明白了
Manipulate::vsform does not have the correct form for a variable specification
Run Code Online (Sandbox Code Playgroud)
所以,我想,好吧,让我自己填写结构,然后调用process []函数,所以我这样做了: …