小编asi*_*sim的帖子

Mathematica中的并行编程

我感兴趣的是运行相同的函数,以并行方式使用mulitple内核上的参数的不同值来执行一些蒙特卡罗评估.我还想确保整个函数在同一个内核上运行,而不会在函数内的计算分布在内核中.例如,假设我有一个功能(故意简化)

f[a_, b_] := Module[{}, RandomReal[{a, b}]]


In[1]:= LaunchKernels[]

Out[1]= {KernelObject[1, "local"], KernelObject[2, "local"], 
 KernelObject[3, "local"], KernelObject[4, "local"], 
 KernelObject[5, "local"], KernelObject[6, "local"], 
 KernelObject[7, "local"]}

SeedRandom[795132, Method -> "ParallelGenerator"];

m1 = 1; m2 = 2; m3 = 3; m4 = 4; m5 = 5; m6 = 6; m7 = 7; m8 = 8;

DistributeDefinitions[f, m1, m2, m3, m4, m5, m6, m7, m8];
Run Code Online (Sandbox Code Playgroud)

我现在想在五个不同的内核上运行f [m1,m2],f [m3,m4],f [m5,m6],f [m7,m8] f [m9,m10],这些内核之间没有信息传递,即,在不同内核上使用单独的随机数流.

如何在Mathematica中做到这一点?

wolfram-mathematica

8
推荐指数
1
解决办法
1200
查看次数

在非张量列表上使用已编译的可列表函数

我有兴趣在不需要张量的列表上使用Listable Compiled函数.我想理解为什么有些函数可以工作,而有些函数却没有,关闭内核.这是一个例子.

假设我们有两个矩阵m1和m2如下.

m1 = {{1.0, 0.5, 0.5}, {0.5, 1.0, 0.5}, {0.5, 0.5, 1.0}};

m2 = {{1.0, 0.5}, {0.5, 1.0}};
Run Code Online (Sandbox Code Playgroud)

我们可以制作两个不同的列表,第一个是张量,第二个不是.

In[3]:= mList1 = {m1, m1};

In[4]:= TensorQ[mList1]

Out[4]= True

In[5]:= mList2 = {m1, m2};

In[6]:= TensorQ[mList2]

Out[6]= False
Run Code Online (Sandbox Code Playgroud)

类似地,令v1和v2为两个向量,vList1和vList2为两个列表,如下所示

v1 = {1.0, 1.5, 0.9};

v2 = {1.1, 0.7};

In[9]:= vList1 = {v1, v1};

In[10]:= TensorQ[vList1]

Out[10]= True

In[11]:= vList2 = {v1, v2};

In[12]:= TensorQ[vList2]

Out[12]= False
Run Code Online (Sandbox Code Playgroud)

现在我们定义两个可列表函数func1和func2

func1 = Compile[{{m, _Real, 2}, {v, _Real, 1}},
   m.v,
   RuntimeAttributes -> Listable …
Run Code Online (Sandbox Code Playgroud)

wolfram-mathematica mathematica-8

6
推荐指数
1
解决办法
443
查看次数

在不使用Export的情况下将向量写入文件

我感兴趣的是将多个向量写入文件,使得每个向量在文件中形成一行,并在生成后立即写入文件.向量的元素需要用单个空格分隔,我不想包含{ }向量的括号.基本上,我想模仿fprintf("file", "%f %f %f\n")C 的功能.

这就是我所拥有的.有没有更好的方法呢?

st1 = OpenWrite["C:\\junk\\mu.out", FormatType -> OutputForm];

vt = Table[
   v = RandomReal[{0, 1}, 5];

   For[j = 1, j <= Length[v], j++, 
    WriteString[
     st1, 
     SequenceForm[NumberForm[v[[j]], ExponentFunction -> (Null &)], 
      " "]
     ]
    ];
   Write[st1, ""];
   v,
   {200}
   ];

In[3]:= Close[st1]

Out[3]= "C:\\junk\\mu.out"
Run Code Online (Sandbox Code Playgroud)

基于精彩的Riffle功能,礼貌Arnoud和Mr. Wizard,我在下面修改它如下:

WriteVector[stream_, vector_] :=
 Apply[WriteString[stream, ##, "\n"] &, 
  Riffle[Map[NumberForm[#, ExponentFunction -> (Null &)] &, vector], 
   " "]
  ]
Run Code Online (Sandbox Code Playgroud)

wolfram-mathematica

6
推荐指数
1
解决办法
282
查看次数

使用Dynamic监视功能内的进度

我有兴趣使用Dynamic监控计算的进度.这可以通过以下方式交互式完成:

In[3]:= Dynamic[iter]

In[4]:= Table[{iter, iter^2}, {iter, 1, 500000}];
Run Code Online (Sandbox Code Playgroud)

但是,如果表位于诸如此类的函数内

f[m_] := Module[{iter}, Table[{iter, iter^2}, {iter, 1, m}]]; 
Run Code Online (Sandbox Code Playgroud)

当我执行函数时,如何跟踪iter的值

f[500000];
Run Code Online (Sandbox Code Playgroud)

wolfram-mathematica

6
推荐指数
1
解决办法
901
查看次数

如何编译计算Hessian的函数?

我期待看到如何编译计算对数似然的Hessian的函数,以便它可以有效地与不同的参数集一起使用.

这是一个例子.

假设我们有一个函数来计算logit模型的对数似然,其中y是向量,x是矩阵.beta是参数的向量.

 pLike[y_, x_, beta_] :=
 Module[
  {xbeta, logDen},
  xbeta = x.beta;
  logDen = Log[1.0 + Exp[xbeta]];
  Total[y*xbeta - logDen]
  ]
Run Code Online (Sandbox Code Playgroud)

鉴于以下数据,我们可以如下使用它

In[1]:= beta = {0.5, -1.0, 1.0};

In[2]:= xmat = 
  Table[Flatten[{1, 
     RandomVariate[NormalDistribution[0.0, 1.0], {2}]}], {500}];

In[3]:= xbeta = xmat.beta;

In[4]:= prob = Exp[xbeta]/(1.0 + Exp[xbeta]);

In[5]:= y = Map[RandomVariate[BernoulliDistribution[#]] &, prob] ;

In[6]:= Tally[y]

Out[6]= {{1, 313}, {0, 187}}

In[9]:= pLike[y, xmat, beta]

Out[9]= -272.721
Run Code Online (Sandbox Code Playgroud)

我们可以写下它的粗麻布如下

 hessian[y_, x_, z_] :=
  Module[{},
   D[pLike[y, x, z], {z, 2}]
  ]


In[10]:= …
Run Code Online (Sandbox Code Playgroud)

wolfram-mathematica hessian-matrix

2
推荐指数
1
解决办法
1522
查看次数