无损地将Mathematica表达式转换为字符串(保存在内存中的字符串,而不是导出到文件)的正确方法是什么?
我正在寻找一个文字表示
SparseArray,Graph,Dispatch,CompiledFunction,等完好.例如,循环SparseArray通过此表示应该保持稀疏(并且不将其转换为正常列表).这ToString[expr, FullForm]足够吗?怎么样ToString[expr, InputForm]?
注1:这是在试图解决Graph内部表示偶尔被破坏的一些错误时出现的.但是我对上面一般问题的答案感兴趣.
注2:Save肯定会这样做,但它会写入文件(可能使用流来解决这个问题),并且它只编写与符号相关的定义.
问题的解决方案是在问题上找到的,Executable在Wine上的运行速度比Windows快 - 为什么? Glibc floor()可能是根据系统库实现的.
我有一个非常小的C++程序(~100行)用于物理模拟.我在同一台计算机上的Ubuntu Oneiric和Windows XP上用gcc 4.6.1编译了它.我使用了完全相同的命令行选项(相同的makefile).
奇怪的是,在Ubuntu上,在程序完成多比在Windows(〜7.5 s和13.5 S)更快.在这一点上,我认为这是编译器的差异(尽管使用相同的版本).
但更奇怪的是,如果我跑下酒Windows可执行文件,它仍然快于在Windows(我得到11的"真实"和7.7的"用户"时间 - 这包括酒启动.)
我糊涂了.当然,如果在同一个CPU上运行相同的代码,则时间应该没有差别.
这可能是什么原因? 我能做错什么?
该程序执行最小I/O(输出单行),并且仅使用vectorSTL中的固定长度(即不应涉及系统库).在Ubuntu上我使用了默认的gcc,在Windows上使用了Nuwen发行版.我确认在进行基准测试时CPU使用率接近于零(我关闭了大多数程序).在Linux上我用于time计时.在我使用的Windows上timethis.exe.
UPDATE
我做了一些更精确的计时,比较适用于Windows XP,葡萄酒和Linux的GCC和MSVC编译程序的不同输入(运行时间必须是正比于输入)的运行时间.所有数字均以秒为单位,是至少3次运行的最小值.
在Windows上我使用timethis.exe(挂机时间),在Linux和Wine上我使用了时间(CPU时间).(timethis.exe在Wine上断了)我确保没有其他程序使用CPU并禁用了病毒扫描程序.
gcc的命令行选项-march=pentium-m -Wall -O3 -fno-exceptions -fno-rtti(即禁用了例外).

我们从这些数据中看到的是:
差异不是由于过程启动时间,因为运行时间与输入成比例
运行Wine和Windows之间的区别只存在于gcc编译的程序,而不是msvc编译的程序:它不能被其他程序在Windows上占用CPU或者timethis.exe被破坏.
右键单击Image前端时,可以选择以实际大小显示(即1:1屏幕到图像像素大小).
如何强制图像显示?制作时Row或Column的ImageS,如何对它们进行按实际尺寸显示?
我正在比较图像重采样方法,看看哪一种方法在出现这种方法时能为最锋利的边缘提供最佳结果.作为一种解决方法我ImageAssemble所有的图像,所以我只需要右键单击一次,以使它们以实际大小显示.
是否可以使用或仅ReadList使用ReadList[..., Word]ASCII 来读取UTF-8(或任何其他)编码的文本文件?如果它只是ASCII,是否可以"修复"已经读取的数据的编码具有良好的性能(即保留ReadList过度的性能优势Import)?
Import[..., CharacterEncoding -> "UTF8"]有效,但它比它慢了很多ReadList. $CharacterEncoding对...没有影响ReadList
要测试大输入的性能,请参阅此问题中的测试文件.
以下是大型文本文件的答案时间:
进口
In[2]:= Timing[
data = Import[file, "Text"];
]
Out[2]= {5.234, Null}
Run Code Online (Sandbox Code Playgroud)
海克
In[4]:= Timing[
data = ReadList[file, String];
FromCharacterCode[ToCharacterCode[data], "UTF8"];
]
Out[4]= {4.328, Null}
Run Code Online (Sandbox Code Playgroud)
巫师先生
In[5]:= Timing[
string = FromCharacterCode[BinaryReadList[file], "UTF-8"];
]
Out[5]= {2.281, Null}
Run Code Online (Sandbox Code Playgroud) 是否可以使用Install[]自定义PATH环境变量启动MathLink程序?
我正在尝试使用mEngine将Mathematica连接到Windows上的MATLAB.只有mEngine.exe在PATH环境变量包含MATLAB库的路径时才会启动它.是否可以修改PATH以仅启动此程序,而无需修改系统路径?还是有其他方式推出mEngine.exe?
下面的代码返回不同的值NExpectation和Expectation.如果我尝试相同的,NormalDistribution[]我会得到收敛错误NExpectation(但最终的结果仍然0适用于所有这些).是什么导致了这个问题?
U[x_] := If[x >= 0, Sqrt[x], -Sqrt[-x]]
N[Expectation[U[x], x \[Distributed] NormalDistribution[1, 1]]]
NExpectation[U[x], x \[Distributed] NormalDistribution[1, 1]]
Run Code Online (Sandbox Code Playgroud)
输出:
-0.104154
0.796449
Run Code Online (Sandbox Code Playgroud) 任何人都可以复制以下内容吗?
在Windows Vista或Windows 7中的MMA 8.04中,在动画运行时右键单击动画会导致整个Mathematica会话(内核和前端)崩溃.
我有一个类似自定义assert()的宏来调用abort()失败。使用 AddressSanitizer 时,我更喜欢在断言失败时打印通常的漂亮堆栈跟踪。如何做到这一点?
abort()被调用时打印诊断信息?abort()这里?有没有人在远程并行内核中使用 Mathematica 的 C 扩展(LibraryLink 或 MathLink——目前我正在使用 LibraryLink)?
简而言之:当子内核在远程机器上运行时,如何在并行和非并行评估中透明地使用 LibraryLink 定义的函数(请参阅CreateLibrary和LibraryFunctionLoad)?
我找了一些设置步骤,这将让我有一个libraryFun函数(用C语言编写),可无论是通常称为libraryFun[args],或并行(两者的Parallelize@Table[libraryFun[arg], {arg, 0, 100}]和相同的ParallelTable[]时候subkernels在远程机器上运行)。
如果我也没有遇到问题,远程运行主内核也可能会更好。
与此同时,我取得了一些进展。我会在这里描述它。
首先,ParallelEvaluate将对所有并行内核中的表达式求值。如果 C 扩展的源文件被复制到远程机器,我们可以像这样在那里编译它们:
ParallelNeeds["CCompilerDriver`"]
k1 = First@Kernels[]
ParallelEvaluate[SetDirectory["/path/to/source/files"]]
ParallelEvaluate[CreateLibrary["sourefile", "myLibrary"]]
Run Code Online (Sandbox Code Playgroud)
此操作只需执行一次。我假设该库已经在主内核机器上编译。
在此之后,在所有后续会话中,我们可以FindLibrary在主计算机和远程计算机上使用来加载库。
LibraryFunctionLoad[myFun = FindLibrary["myLibrary"], "fun", ...]
ParallelEvaluate[myFun = LibraryFunctionLoad[FindLibrary["myLibrary"], "fun", ...]]
Run Code Online (Sandbox Code Playgroud)
麻烦来了。 由于路径myFun不同,在主内核和并行内核中会有不同的值。
所以问题是:如何确保myFun主内核和并行内核之间的值不会意外同步?
我将在一个孤立的例子中展示这可能是如何意外发生的:
In[1]:= LaunchKernels[2]
Out[1]= {KernelObject[1, "local"], KernelObject[2, "local"]}
Run Code Online (Sandbox Code Playgroud)
x在主内核中设置值: …
我正在使用来自C库的向量类型,看起来类似于
struct Vec {
int *stor_begin;
int *stor_end;
int *end;
};
Run Code Online (Sandbox Code Playgroud)
我试图通过创建free begin()和end()functions 来为此类型启用基于范围的for循环,但是我从clang收到此错误:
错误:范围类型'igraph_vector_int_t'具有'end'成员但没有'begin'成员
有没有办法(使用C ++ 11)为这种类型(我不能直接修改)启用基于范围的for循环?
这是一个演示该问题的最小示例:
struct Vec {
int *stor_begin;
int *stor_end;
int *end;
};
Run Code Online (Sandbox Code Playgroud)
来自gcc 7.2 / Wandbox的错误:
prog.cc: In function 'void testBar(Bar&)':
prog.cc:26:26: error: range-based 'for' expression of type 'Bar' has an 'end' member but not a 'begin'
for (const auto &x : bar) {
^~~
prog.cc:26:26: error: expression cannot be used as a function
Run Code Online (Sandbox Code Playgroud)