小编Sza*_*lcs的帖子

为什么不使用Begin []工作?

如果我们逐个评估这些行,x将在上下文中创建cc.

Begin["cc`"];
x = 1;
End[]
Run Code Online (Sandbox Code Playgroud)

但是,如果我们一起评估它们,

(Begin["cc`"];
x = 1;
End[])
Run Code Online (Sandbox Code Playgroud)

然后x将创建Global.尽管有以下印刷cc`:

(Begin["cc`"];
Print[$Context];
End[])
Run Code Online (Sandbox Code Playgroud)

这种行为的原因是什么? 我的猜测是,上下文在解析阶段才起作用,而不是评估.

使用案例:我想创建一个调色板Button,如果它们尚不存在,将在"私有"上下文中定义一些符号,以避免与全局变量发生冲突. 除了将所有定义放在包文件中并从调色板加载它们之外,首选方法是什么?(我想保持调色板自包含.)

parsing symbols wolfram-mathematica

12
推荐指数
1
解决办法
340
查看次数

为什么案例[]这么慢?有什么技巧可以加快速度吗?

在尝试粘贴图像时,我发现这Cases[]很慢.

要重现,首先将大图像复制到剪贴板(只需按Print Screen),然后评估以下内容:

In[33]:= SetSystemOptions["PackedArrayOptions" -> "UnpackMessage" -> True];

In[34]:= AbsoluteTiming[nb = NotebookGet@ClipboardNotebook[];]
Out[34]= {0.4687500, Null}

In[35]:= AbsoluteTiming[d1 = nb[[1, 1, 1, 1, 1, 1, 1]];]
Out[35]= {0., Null}

In[36]:= AbsoluteTiming[d2 = First@Cases[nb, r_RasterBox :> First[r], Infinity, 1];]

During evaluation of In[36]:= Developer`FromPackedArray::unpack: Unpacking array in call to Notebook. >>

Out[36]= {0.9375000, Null}
Run Code Online (Sandbox Code Playgroud)

(我在Windows上做了这个,不确定其他系统上的粘贴代码是否相同.)

请注意,CasesPart直接使用相比,使用提取数据非常慢,即使我明确告诉Cases我只需要一个匹配.

我确实发现(如上所示)Cases由于某种原因触发解包,即使搜索应该在它到达内部的打包数组之前停止.使用比Infinity可能避免解包的浅层规范.

问题:Cases在这里 使用比Part(如果子表达式可以出现在不同的位置怎么样?)更容易和更可靠?有没有办法在Cases这里快速,可能通过使用不同的模式或不同的选项?


可能相关的问题:Mathematica的模式匹配效果不佳? …

performance wolfram-mathematica pattern-matching

12
推荐指数
1
解决办法
737
查看次数

搜索列表是否有相应的StringPosition []?如果没有,实现这个的最快方法是什么?

是否有一个函数可以搜索元素序列中的子序列?我找了一个模拟StringPositionList秒.在我目前的应用程序,我用整数名单的工作,但我很想在一般FindSequence[list, pattern, n]功能,将找到的第一个n的出现patternlist.


这是一个玩具示例:

生成一些数据:

In[1]:= $HistoryLength = 0    
Out[1]= 0

In[2]:= Timing[digits = First[RealDigits[\[Pi], 2, 10000000]];]    
Out[2]= {26.5, Null}
Run Code Online (Sandbox Code Playgroud)

让我们将它转​​换为字符串,以便我们可以比较StringPosition.这是一个非常缓慢的记忆饥饿.(评估完成后,内存将被释放.)

In[3]:= Timing[str = StringJoin[ToString /@ digits];]    
Out[3]= {43.813, Null}
Run Code Online (Sandbox Code Playgroud)

我正在寻找这个子序列:

In[4]:= patt = {1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 
   1, 0, 1, 1};

In[5]:= strpatt = StringJoin[ToString /@ patt];
Run Code Online (Sandbox Code Playgroud)

搜索字符串非常快:

In[6]:= StringPosition[str, strpatt] …
Run Code Online (Sandbox Code Playgroud)

search wolfram-mathematica

12
推荐指数
1
解决办法
977
查看次数

是否可以在两个R实例之间推/拉变量?

假设我有两个R运行实例.是否存在可轻松将变量/数据从一个实例发送到另一个实例的现有解决方案?甚至可能在两个实例之间同步变量的值?

例如,首先两个实例(R1和R2)将以某种方式连接,然后在R1中:

> a <- 12
> push(a)
Run Code Online (Sandbox Code Playgroud)

在R2的这一点上:

> a
[1] 12
Run Code Online (Sandbox Code Playgroud)

这里的关键字是易用性:尽可能快地(对于用户)以交互方式同步某些变量的值.我会在Mathematica的RLink中使用它在一个R实例中以交互方式工作,并在Mathematica的实例中推送/拉取数据.


我意识到这个问题可能听起来很奇怪.我之所以希望存在这样的东西,是因为它对并行或分布式计算也很有用(这不是我的用例).

r

12
推荐指数
3
解决办法
1392
查看次数

使用C++ 11 <random>生成高效的随机数

我试图了解如何使用C++ 11随机数生成功能.我担心的是表现.

假设我们需要在两者之间生成一系列随机整数0..k,但k每一步都会发生变化.什么是最好的方法?

例:

for (int i=0; i < n; ++i) {
    int k = i; // of course this is more complicated in practice
    std::uniform_int_distribution<> dist(0, k);
    int random_number = dist(engine);
    // do something with random number
}
Run Code Online (Sandbox Code Playgroud)

<random>标头提供的分发非常方便.但它们对用户来说是不透明的,因此我无法轻易预测它们的表现.例如,不清楚dist上面的构造将导致多少(如果有的话)运行时间开销.

相反,我可以使用类似的东西

std::uniform_real_distribution<> dist(0.0, 1.0);
for (int i=0; i < n; ++i) {
    int k = i; // of course this is more complicated in practice
    int random_number = std::floor( (k+1)*dist(engine) );
    // do …
Run Code Online (Sandbox Code Playgroud)

c++ random performance c++11

12
推荐指数
1
解决办法
2203
查看次数

如何为自定义模板化迭代器实现std :: distance()?

我有一个模板化的双向迭代器.我不想让它随机访问,因为it += n操作不是恒定的时间.但是,it2 - it1操作恒定的时间.我想专门std::distance()研究这个迭代器,以便使用它的算法(例如std::vector::assign())可以利用有效的差异操作.如果迭代器是模板,我该怎么做?

这是一个玩具示例:

#include <iterator>
#include <iostream>

// template bidirectional iterator
template<typename T>
class iter : public std::iterator<std::bidirectional_iterator_tag, T> {
    T *ptr;
public:
    iter(T *ptr) : ptr(ptr) { }

    iter() = default;
    iter(const iter &) = default;
    iter &operator = (const iter &) = default;

    T *operator * () { return ptr; }

    bool operator == (const iter &it) { return ptr == it.ptr; } …
Run Code Online (Sandbox Code Playgroud)

c++ templates template-specialization

12
推荐指数
1
解决办法
1081
查看次数

快速加载跨平台替代MX文件(Mathematica)

在Mathematica中,可以使用Save(.m文件)或DumpSave(.mx文件)保存中间结果/工作区的部分状态.

.m文件是可移植的,但加载速度很慢(使用大数据).

.mx文件加载速度很快,但在平台/体系结构之间无法移植.

有没有办法以加载它们的方式保存通用Mathematica表达式,并且它们可以在平台之间移植?有没有人尝试/基准测试不同的方法来做到这一点?

一种可能的解决方案是保存.m文件(跨平台),然后在新平台上开始工作时将它们转换为.mx文件(一次性操作).有没有一种全自动的方式将.m文件转换为.mx文件?

serialization wolfram-mathematica

11
推荐指数
1
解决办法
870
查看次数

用于计算有向图上非循环路径数的快速算法

简而言之,我需要一个快速算法来计算简单有向图中有多少非循环路径.

通过简单的图表我的意思是没有自循环或多个边缘.甲路径可以从任何节点开始,并且必须具有没有出边的节点上结束.如果没有边缘出现两次,则路径是非循环的.

我的图表(经验数据集)只有20-160个节点,但是,其中一些节点有很多周期,因此会有非常多的路径,我的天真方法对某些图形来说根本不够快我有.

我目前正在做的是使用递归函数沿着所有可能的边缘"下降",同时跟踪我已访问过的节点(并避免它们).到目前为止,我用的最快的解决方案是用C++编写的,并在递归函数中使用std :: bitset参数来跟踪已访问的节点(访问节点由位1标记).该程序在1-2分钟内在样本数据集上运行(取决于计算机速度).对于其他数据集,运行需要一天以上,或者显然要长得多.

样本数据集:http://pastie.org/1763781 (每行是边对)

样本数据集的解决方案(第一个数字是我开始的节点,第二个数字是从该节点开始的路径计数,最后一个数字是总路径计数):http: //pastie.org/1763790

如果您对复杂度较高的算法有所了解,请与我们联系.我也对近似解决方案感兴趣(用蒙特卡罗方法估算路径的数量).最后,我还想测量平均路径长度.

编辑:也在相同标题下的MathOverflow上发布,因为它可能更相关.希望这不违反规则.无法链接,因为网站不允许超过2个链接...

algorithm optimization complexity-theory graph directed-graph

10
推荐指数
1
解决办法
3347
查看次数

使用Compile有效处理小向量列表

我们经常需要处理由坐标列表组成的数据:data = {{x1,y1}, {x2,y2}, ..., {xn,yn}}.它可以是2D或3D坐标,或固定长度小矢量的任何其他任意长度列表.

让我Compile通过总结2D向量列表的简单示例来说明如何使用这些问题:

data = RandomReal[1, {1000000, 2}];
Run Code Online (Sandbox Code Playgroud)

一,显而易见的版本:

fun1 = Compile[{{vec, _Real, 2}},
  Module[{sum = vec[[1]]},
   Do[sum += vec[[i]], {i, 2, Length[vec]}];
   sum
   ]
  ]
Run Code Online (Sandbox Code Playgroud)

它有多快?

In[13]:= Do[fun1[data], {10}] // Timing
Out[13]= {4.812, Null}
Run Code Online (Sandbox Code Playgroud)

二,不太明显的版本:

fun2 = Compile[{{vec, _Real, 1}},
  Module[{sum = vec[[1]]},
   Do[sum += vec[[i]], {i, 2, Length[vec]}];
   sum
   ]
  ]

In[18]:= Do[
  fun2 /@ Transpose[data],
  {10}
  ] // Timing

Out[18]= {1.078, Null}
Run Code Online (Sandbox Code Playgroud)

如您所见,第二个版本要快得多.为什么?因为关键操作sum += ...是添加数字,fun2而它是添加 …

wolfram-mathematica

10
推荐指数
2
解决办法
2793
查看次数

你能解释一下这个Mathematica $ Assumptions行为吗?

考虑以下三行Mathematica代码并注意输入行1和3完全相同(这是我发现的用于演示此行为的最小代码段).

>> Integrate[Exp[-a^2] Sin[2 p] ((a^2 + b^2) + b*Cos[p] + a*Sin[p]), {p, 0, 2 \[Pi]}]
0

>> $Assumptions = {t > 0};
>> Integrate[Exp[-a^2] Sin[2 p] ((a^2 + b^2) + b*Cos[p] + a*Sin[p]), {p, 0, 2 \[Pi]}]

8/3 Sqrt[a^2+b^2] E^-a^2
Run Code Online (Sandbox Code Playgroud)

请注意,积分应该产生0,就像在Mathematica的第一个答案中一样.我输入的假设显然与集成无关.这是一个错误(我使用Mathematica 8.0)?

更奇怪的是,如果我将积分分成2或3个积分的总和,则每个积分都会产生0.如果我从积分中取出不依赖于p的部分,那就相同了.

对我来说它看起来像一个bug,但如果有什么我想念的,请告诉我.

wolfram-mathematica

10
推荐指数
1
解决办法
372
查看次数