小编Sza*_*lcs的帖子

以文本形式保留Mathematica表达式

无损地将Mathematica表达式转换为字符串(保存在内存中的字符串,而不是导出到文件)的正确方法是什么?

我正在寻找一个文字表示

  1. 将保留所有信息,包括保持特殊(和可能的原子)的对象,例如SparseArray,Graph,Dispatch,CompiledFunction,等完好.例如,循环SparseArray通过此表示应该保持稀疏(并且不将其转换为正常列表).
  2. 循环相对较快(来回转换).

ToString[expr, FullForm]足够吗?怎么样ToString[expr, InputForm]

注1:这是在试图解决Graph内部表示偶尔被破坏的一些错误时出现的.但是我对上面一般问题的答案感兴趣.

注2:Save肯定会这样做,但它会写入文件(可能使用流来解决这个问题),并且它只编写与符号相关的定义.

wolfram-mathematica

5
推荐指数
2
解决办法
363
查看次数

Linux上的程序速度比Windows快 - 为什么?

问题的解决方案是在问题上找到的,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(即禁用了例外).

计时

我们从这些数据中看到的是:

  1. 差异不是由于过程启动时间,因为运行时间与输入成比例

  2. 运行Wine和Windows之间的区别只存在于gcc编译的程序,而不是msvc编译的程序:它不能被其他程序在Windows上占用CPU或者timethis.exe被破坏.

c++ linux windows benchmarking gcc

5
推荐指数
1
解决办法
6013
查看次数

在Mathematica中强制图像以实际大小显示

右键单击Image前端时,可以选择以实际大小显示(即1:1屏幕到图像像素大小).

如何强制图像显示?制作时RowColumnImageS,如何对它们进行按实际尺寸显示?

我正在比较图像重采样方法,看看哪一种方法在出现这种方法时能为最锋利的边缘提供最佳结果.作为一种解决方法我ImageAssemble所有的图像,所以我只需要右键单击一次,以使它们以实际大小显示.

wolfram-mathematica

5
推荐指数
1
解决办法
306
查看次数

使用ReadList读取UTF-8文本文件

是否可以使用或仅ReadList使用ReadList[..., Word]ASCII 来读取UTF-8(或任何其他)编码的文本文件?如果它只是ASCII,是否可以"修复"已经读取的数据的编码具有良好的性能(即保留ReadList过度的性能优势Import)?

Import[..., CharacterEncoding -> "UTF8"]有效,但它比它慢了很多ReadList. $CharacterEncoding对...没有影响ReadList

在此处下载UTF-8编码文件样本.

要测试大输入的性能,请参阅此问题中的测试文件.


以下是大型文本文件的答案时间:

进口

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)

wolfram-mathematica

5
推荐指数
2
解决办法
644
查看次数

使用任意PATH环境安装MathLink程序

是否可以使用Install[]自定义PATH环境变量启动MathLink程序?

我正在尝试使用mEngine将Mathematica连接到Windows上的MATLAB.只有mEngine.exePATH环境变量包含MATLAB库的路径时才会启动它.是否可以修改PATH以启动此程序,而无需修改系统路径?还是有其他方式推出mEngine.exe

interop wolfram-mathematica environment-variables mathlink

5
推荐指数
1
解决办法
622
查看次数

Mathematica:NExpectation vs Expectation - 结果不一致

下面的代码返回不同的值NExpectationExpectation.如果我尝试相同的,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)

wolfram-mathematica

5
推荐指数
2
解决办法
293
查看次数

右键单击动画会导致Mathematica 8.04崩溃

任何人都可以复制以下内容吗?

在Windows Vista或Windows 7中的MMA 8.04中,在动画运行时右键单击动画会导致整个Mathematica会话(内核和前端)崩溃.

wolfram-mathematica

5
推荐指数
0
解决办法
236
查看次数

将自定义 assert() 与 AddressSanitizer 集成

我有一个类似自定义assert()的宏来调用abort()失败。使用 AddressSanitizer 时,我更喜欢在断言失败时打印通常的漂亮堆栈跟踪。如何做到这一点?

  • 是否可以让 AddressSanitizer 在abort()被调用时打印诊断信息?
  • 我可以调用 AddressSanitizer 函数来手动打印堆栈跟踪吗?
  • AddressSanitizer 是否提供了一个我可以使用的函数而不是abort()这里?
  • 我对 Clang 和 GCC 的解决方案感兴趣。

c gcc runtime-error clang address-sanitizer

5
推荐指数
1
解决办法
104
查看次数

远程并行内核和 LibraryLink —— 如何让它们一起工作?

有没有人在远程并行内核中使用 Mathematica 的 C 扩展(LibraryLink 或 MathLink——目前我正在使用 LibraryLink)?

简而言之:当子内核在远程机器上运行时,如何在并行和非并行评估中透明地使用 LibraryLink 定义的函数(请参阅CreateLibraryLibraryFunctionLoad)?

我找了一些设置步骤,这将让我有一个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在主内核中设置值: …

wolfram-mathematica mathematica-8

4
推荐指数
1
解决办法
639
查看次数

为具有“结束”成员变量的类型启用基于范围的

我正在使用来自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)

c++ c++11

4
推荐指数
1
解决办法
141
查看次数