我想在Mathematica中绘制一个"分解树".
我有一个函数f,它接受一个对象并返回该对象的所有组件作为列表.出于这个问题的目的,让我们按如下方式分解Mathematica表达式(我的实际f依赖于外部数据库来分解不同类型的对象,所以我不能轻易地发布它):
f[e_?AtomQ] := {}
f[e_] := List @@ e
Run Code Online (Sandbox Code Playgroud)
我想创建一个树图,显示在递归继续应用时如何分解对象f.对于f上面的特定示例TreeForm,除了应该在每个节点上显示完整表达式(而不仅仅是头部)之外,我们应该得到与输出非常相似的东西.节点的子节点将成为其返回的组件f.
请注意,元素可以在这样的分解树中重复,但在输出中不会重复元素,TreePlot因为它与图形一起使用.一个想法是为每个节点生成一个唯一的"内部名称",构建一个图形,并使用TreePlot,将其设置为显示节点的实际形式而不是它们的"内部名称"
某些类型的对象在Mathematica中具有特殊的输入/输出格式.这包括Graphics光栅图像,以及Mathematica 8的图形(Graph[]).遗憾的是,大型图形可能需要很长时间才能实现可视化,这比我在交互式工作期间对其进行的大多数其他操作要长得多.
如何防止Graph[]StandardForm和TraditionalForm 中对象的自动布局,并将它们显示为例如-Graph-,最好保留输出的可解释性(可能使用Interpretation?).我认为这将涉及改变Format和/或MakeBoxes以某种方式,但我没有成功实现这一点.
我想以可逆的方式执行此操作,并且最好定义一个函数,该函数在应用于Graph对象(不同于GraphPlot非交互式对象)时将返回原始交互式图形显示.
在相关的说明中,有没有办法检索与某些符号关联的Format/MakeBoxes定义? FormatValues是一个相关的功能,但它是空的Graph.
示例会话:
In[1]:= Graph[{1->2, 2->3, 3->1}]
Out[1]= -Graph-
In[2]:= interactiveGraphPlot[%] (* note that % works *)
Out[2]= (the usual interactive graph plot should be shown here)
Run Code Online (Sandbox Code Playgroud) 将Mathematica中的手绘对象与编程生成的对象分开的最简单/最方便的方法是什么?
交互式绘图工具既方便又实用.但是如果我在绘图上绘制一些东西,一旦重新生成绘图,它就会丢失.有一个方便的解决方案吗?
我可以将绘图放在空图上,将它们与实际绘图结合起来.但这又是不方便的,因为我需要手动设置空图的绘图范围,我没有看到背景,我正在添加注释.
有没有办法禁用单元格组/节中的所有输入单元格,以后会轻易撤消?
我的目标是保持笔记本的一部分完好无损,但在前端选择"评估笔记本"时阻止对其进行评估.
有单元格 - >单元格属性 - >可评估,但使用它需要我手动选择每个输入单元格并更改/恢复此属性.这是太多的工作.我将文本/子部分/输出单元格隔行扫描.
使用UI有更好的方法吗?如果没有,是否有简单的编程方式?
编辑:我发现Alt-click,它选择笔记本中的所有输入单元格.这可以仅限于一个部分/细胞群吗?
偶尔我们会研究某些System`函数是如何定义的(当它们用Mathematica编写时).这个问题是关于最好的方法.
要记住的要点:
病程中ReadProtected需要先删除.
Builtins通常需要在加载到内核之前至少使用一次.当它们具有扩展功能(例如通过选项)时,单个简单调用通常是否足够?
Information(??)以难以阅读的格式给出定义(没有缩进,并且所有私有上下文名称都是前置的).什么是摆脱上下文名称,并获得格式化代码的最佳方法?
摆脱某些背景的一个想法是Block[{$ContextPath = Append[$ContextPath, "SomeContext`Private`"], Information[symbol]].代码可以使用Workbench自动格式化.一些问题仍然存在,例如Information不引用字符串,从而阻止代码被复制到Workbench中.
一般来说,我对人们如何做到这一点感兴趣,他们使用什么方法使内置代码尽可能易于阅读.
使用案例:例如,最近我深入研究了RunThrough当我发现它在Windows XP上无法运行时的代码(事实证明,当它们的路径包含空格时,它无法引用临时文件的名称).
更新: 似乎曾经有一个函数用于打印没有上下文的定义Developer`ContextFreeForm,但它在新版本中不再起作用.
MATLAB Engine API允许从C程序访问MATLAB功能.要设置MATLAB Engine会话,可以调用该engOpen函数.默认情况下,这将启动MATLAB的新实例,专门用于Engine应用程序.
我想要的是使用Engine应用程序中已经运行的 MATLAB会话,以便我可以访问它的变量. 我需要在Linux和OS X上执行此操作.
Engine接口在Windows(它使用COM服务器)和Unix上有非常不同的实现.在Unix上,我们必须将MATLAB可执行文件的位置传递给engOpenWindows,而在引擎使用COM服务器的情况下,我们不会.在Windows上是可以使用MATLAB的现有实例Engine应用程序:只要运行enableservice('AutomationServer', true).在Unix系统上有什么解决方案吗?
我希望有一个通用的解决方案 - 可能没有文档 - 因为,基于文档,Python接口似乎允许这样做.我在OS X上测试了这个并且它可以工作.例如,我可以启动交互式MATLAB会话,设置变量a=5,然后启动Python,连接到同一个会话并能够检索此变量. 也可以从Java连接到已经运行的会话.
我需要从C开始,而不是从Python开始,因为它将在MATLink,Mathematica-MATLink接口中使用.Python界面如何实现这一目标?如何使用C重现相同的内容?
如果有一个替代的C API而不是"MATLAB Engine"使这成为可能(可能是Python接口所基于的其他一些文档化或未记录的C API),我可以接受这个作为答案.我想要一个可以利用已经运行的交互式 MATLAB会话的C程序.
更新:
Python界面中的一些讨论显示它使用了一个名为的库libmwengine_api.这与记录的MATLAB Engine C API不同.我们可以查看这个库中的符号.在OS X上,
nm -g libmwengine_api.dylib | c++filt
Run Code Online (Sandbox Code Playgroud)
然后我们可以谷歌搜索这些符号或grep MATLAB安装目录中包含它们的文件.出现了纯文本中没有任何内容.
基于此,我相信Python接口使用的是未记录的C++ Engine API,它与旧的C++引擎API不同.
我希望随机均匀地产生混乱。换句话说:对向量进行打乱,使得没有元素留在其原始位置。
要求:
到目前为止,我找到的答案都不是令人满意的,因为它们要么没有均匀采样(或未能证明均匀性),要么没有与拒绝方法进行实际比较。排列1/e = 37%是紊乱,它提供了一个线索,说明相对于拒绝方法,人们最多可以期望什么性能。
我发现的唯一进行实际比较的参考文献是在这篇论文中,该论文对他们提出的算法进行了 7.76 秒的基准测试,而对拒绝方法进行了 8.25 秒的基准测试(参见第 73 页)。这仅加速了 1.06 倍。我想知道是否有可能有更好的东西(> 1.5)。
我可以实现和验证论文中提出的各种算法,并对它们进行基准测试。正确地做到这一点将需要相当多的时间。希望有人做过,能给我一个参考。
当调用带有参数的 Fortran 函数时logical,特别是使用 gfortran 时,我应该在 C 中使用什么参数类型?gfortran 的记录在哪里?
这是一个示例程序,如果没有警告就无法编译:
\n内容one.f:
subroutine proc1(x)\n logical x\n end\nRun Code Online (Sandbox Code Playgroud)\n内容main.c:
void proc1_(_Bool *x);\n\nint main() {\n _Bool x;\n\n proc1_(&x);\n\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n如果我按如下方式使用 GCC 进行编译,并启用 LTO,我会收到有关函数原型不匹配的警告:
\ngfortran -flto -c one.f\ngcc -flto -c main.c\ngcc -flto main.o one.o\nRun Code Online (Sandbox Code Playgroud)\n我收到的警告:
\nmain.c:2:6: warning: type of \'proc1_\' does not match original declaration [-Wlto-type-mismatch]\n 2 | void proc1_(_Bool *x);\n | ^\none.f:2:22: note: \'proc1\' was previously declared here\n …Run Code Online (Sandbox Code Playgroud) 在 macOS 13.3.1 上,strtod()似乎不尊重使用设置的区域设置uselocale(),并且无法正确处理小数点/逗号。这是 macOS 中的错误吗?有解决方法吗?
这是一个测试程序,它演示了这一点printf()并scanf()尊重小数点设置,但strtod()事实并非如此。
#include <locale.h>
#include <xlocale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
int main() {
double x;
const char *num = "12.3";
char *end;
// First we set the locale globally to something that uses decimal
// commas instead of decimal points.
const char *locname = setlocale(LC_ALL, "de_DE");
struct lconv *lc = localeconv();
if (strcmp(lc->decimal_point, ",")) {
/* If decimal point is not …Run Code Online (Sandbox Code Playgroud) 无损地将Mathematica表达式转换为字符串(保存在内存中的字符串,而不是导出到文件)的正确方法是什么?
我正在寻找一个文字表示
SparseArray,Graph,Dispatch,CompiledFunction,等完好.例如,循环SparseArray通过此表示应该保持稀疏(并且不将其转换为正常列表).这ToString[expr, FullForm]足够吗?怎么样ToString[expr, InputForm]?
注1:这是在试图解决Graph内部表示偶尔被破坏的一些错误时出现的.但是我对上面一般问题的答案感兴趣.
注2:Save肯定会这样做,但它会写入文件(可能使用流来解决这个问题),并且它只编写与符号相关的定义.