如果我们逐个评估这些行,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,如果它们尚不存在,将在"私有"上下文中定义一些符号,以避免与全局变量发生冲突. 除了将所有定义放在包文件中并从调色板加载它们之外,首选方法是什么?(我想保持调色板自包含.)
在尝试粘贴图像时,我发现这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上做了这个,不确定其他系统上的粘贴代码是否相同.)
请注意,Cases与Part直接使用相比,使用提取数据非常慢,即使我明确告诉Cases我只需要一个匹配.
我确实发现(如上所示)Cases由于某种原因触发解包,即使搜索应该在它到达内部的打包数组之前停止.使用比Infinity可能避免解包的浅层规范.
问题:Cases在这里 使用比Part(如果子表达式可以出现在不同的位置怎么样?)更容易和更可靠?有没有办法在Cases这里快速,可能通过使用不同的模式或不同的选项?
可能相关的问题:Mathematica的模式匹配效果不佳? …
是否有一个函数可以搜索元素序列中的子序列?我找了一个模拟StringPosition的List秒.在我目前的应用程序,我用整数名单的工作,但我很想在一般FindSequence[list, pattern, n]功能,将找到的第一个n的出现pattern在list.
这是一个玩具示例:
生成一些数据:
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) 假设我有两个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的实例中推送/拉取数据.
我意识到这个问题可能听起来很奇怪.我之所以希望存在这样的东西,是因为它对并行或分布式计算也很有用(这不是我的用例).
我试图了解如何使用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) 我有一个模板化的双向迭代器.我不想让它随机访问,因为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) 在Mathematica中,可以使用Save(.m文件)或DumpSave(.mx文件)保存中间结果/工作区的部分状态.
.m文件是可移植的,但加载速度很慢(使用大数据).
.mx文件加载速度很快,但在平台/体系结构之间无法移植.
有没有办法以加载它们的方式保存通用Mathematica表达式,并且它们可以在平台之间移植?有没有人尝试/基准测试不同的方法来做到这一点?
一种可能的解决方案是保存.m文件(跨平台),然后在新平台上开始工作时将它们转换为.mx文件(一次性操作).有没有一种全自动的方式将.m文件转换为.mx文件?
简而言之,我需要一个快速算法来计算简单有向图中有多少非循环路径.
通过简单的图表我的意思是没有自循环或多个边缘.甲路径可以从任何节点开始,并且必须具有没有出边的节点上结束.如果没有边缘出现两次,则路径是非循环的.
我的图表(经验数据集)只有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
我们经常需要处理由坐标列表组成的数据: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而它是添加 …
考虑以下三行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,但如果有什么我想念的,请告诉我.