公告:1)网站程序升级:Q2A升级到1.8.6,Wordpress升级到5.7.2
2)修复了头像加载慢与提交问题反应慢等问题
2021-06-16

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

语法高亮:在编辑器中点击

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

支持LaTex数学公式
行内公式标识符:\$ 或“$\backslash ($”+“$\backslash )$”,
行间公式标识符:\$\$ 或 “$\backslash [$”+“$\backslash ]$”

社区建议QQ群:365716997

分类

0 投票
1.2k 浏览

现有一个列表其结构如下:

生成表的代码:

f[x_, y_] := Log[x, y]
ParallelTable[
 {(Arg[f[E^(I z) x, y]] + \[Pi])/(2 \[Pi]), 1/(
   1 + 0.3 Log[Abs[f[E^(I z) x, y]] + 1]), 
   1 - 1/(1.1 + 5 Log[Abs[f[E^(I z) x, y]] + 1])], z},
 {z, -\[Pi], \[Pi], \[Pi]/5}, {y, -25 + 0.0012, 25, 1}, {x, 
  0 + 0.0012, 50, 1}]

现在我希望将这个表转化为以下的形式:

(*表的结构抽象一点来看是这样的*)
{
 {
  {{f000,z0},{f001,z0},...,{f00p,z0}},
  {{f010,z0},{f011,z0},...,{f01p,z0}},...
  {{f0q0,z0},{f0q1,z0},...,{f0qp,z0}}
 },
 {
  {{f100,z1},{f101,z1},...,{f10p,z1}},
  {{f110,z1},{f111,z1},...,{f11p,z1}},...
  {{f1q0,z1},{f1q1,z1},...,{f1qp,z1}}
 },...,
 {
  {{fr00,zr},{fr01,zr},...,{fr0p,zr}},
  {{fr10,zr},{fr11,zr},...,{fr1p,zr}},...
  {{frq0,zr},{frq1,zr},...,{frqp,zr}}
 }
}

(*现在希望变成这样*)
{
 g[{
  {{f000},{f001},...,{f00p}},
  {{f010},{f011},...,{f01p}},...
  {{f0q0},{f0q1},...,{f0qp}}
 },z0],
 g[{
  {{f100},{f101},...,{f10p}},
  {{f110},{f111},...,{f11p}},...
  {{f1q0},{f1q1},...,{f1qp}}
 },z1],...,
 g[{
  {{fr00},{fr01},...,{fr0p}},
  {{fr10},{fr11},...,{fr1p}},...
  {{frq0},{frq1},...,{frqp}}
 },zr],
}

 

分类:列表操作 | 用户: EmberEdison (806 分)
修改于 用户:EmberEdison

1个回答

+1 投票
 
已采纳

由于题目经过修改,所以文不对题,但并无本质区别。

方法一,代码不改写,纯列表操作。

Clear[f, g]
data = Table[{f[x, y, z], 
   z}, {z, {z1, z2, z3}}, {y, {y1, y2, y3}}, {x, {x1, x2, x3}}]
g[#[[All, All, {1}]], #[[1, 1, 2]]] & /@ data

方法二,写两次Table。

Table[g[Table[{f[x, y, z]}, {y, {y1, y2, y3}}, {x, {x1, x2, x3}}], 
  z], {z, {z1, z2, z3}}]

对于第二种方法,想要并行是完全可以的,因为通常情况下z是可以不写成并行变量的,只要xy部分并行进行各个核的计算分配就足够了。

f[i_, j_, k_] := (Pause[0.1]; 
   Labeled[Framed[{100 i + 10 j + k}], $KernelID]);
ParallelTable[Table[f[i, j, k], {i, 3}, {j, 3}], {k, 3}] // 
  Dimensions // AbsoluteTiming
ParallelTable[f[i, j, k], {i, 3}, {j, 3}, {k, 3}] // 
  Dimensions // AbsoluteTiming

另外本文代码较为简单,可以通过编译进行加速,虽然效果很一般。至于实际代码能否编译,未知。

Clear[f, g]

ParallelTable[
   With[{a = Log[E^(I z) x, y]}, {(Arg[a] + \[Pi])/(2 \[Pi]), 
     1/(1 + 0.3 Log[Abs[a] + 1]), 1 - 1/(1.1 + 5 Log[Abs[a] + 1]), 
     z}], {z, -\[Pi], \[Pi], \[Pi]/10}, {y, -25 + 0.0012, 25, 1}, {x, 
    0 + 0.0012, 50, 1}] // Dimensions // AbsoluteTiming

g = Compile[{x, y, z},
   Module[{a = Log[E^(I z) x, y]},
    {(Arg[a] + \[Pi])/(2 \[Pi]), 1/(1 + 0.3 Log[Abs[a] + 1]), 
     1 - 1/(1.1 + 5 Log[a + 1]), z}],
   CompilationTarget -> "C", RuntimeOptions -> "Speed"
   ];
ParallelTable[
   g[x, y, z], {z, -\[Pi], \[Pi], \[Pi]/10}, {y, -25 + 0.0012, 25, 
    1}, {x, 0 + 0.0012, 50, 1}] // Dimensions // AbsoluteTiming
用户: 苹果 (2.2k 分)
采纳于 用户:EmberEdison
赶脚不对啊,输出的大小完全不对
非常对不住,我的那个输出表的函数打错了,请再看看
输出表的形式并无本质区别,如果你能明白我的两种解决方案的话,那么改写很容易。
第一种方案的原理是什么QAQ
啊,好像看懂了~~~~谢了
...