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

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

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

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

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

社区建议QQ群:365716997

分类

0 投票
277 浏览

一直是没有搞明白函数的选项是如何定义的。现在有以下这些情况:

1.所调用的下一级自定义函数有和本级函数同名的选项,但是需要要分开处置(ParallelTable)

2.所调用的下一级自定义函数有多个不同种类的选项

fn = x + y + z(*此处随手瞎编的不要在意*)
test0[xmin_, xmax_, ymin_, ymax_, step_, opts : OptionsPattern[]] :=
 Show[Graphics[RasterArray[
    ParallelTable[
     Hue[(Arg[fn] + \[Pi])/(2 \[Pi]),
       1/(1 + 0.3 Log[Abs[fn] + 1]),
       1 - 1/(1.1 + 5 Log[Abs[fn] + 1]), 1]
      {y, ymin + 0.0012, ymax, step},
     {x, xmin + 0.0012, xmax, step},
     Evaluate[FilterRules[{opts}, Options[ParallelTable]]]]]], 
  ImageSize -> (20 + (xmax - xmin)/step),
  Evaluate[FilterRules[{opts}, Options[Graphics]]]]
test1[xmin_, xmax_, ymin_, ymax_, step_, zmin_, zmax_, ymin_, ymax_, 
  step_, zstep_(*然后应该咋写呢?*)] :=
 ListAnimate[ParallelTable[
   test0[xmin, xmax, ymin, ymax, step,(*传送给下一层的选项*)],
   {z, zmin, zmax, (zmax - zmin)/zstep},
   Evaluate[FilterRules[{opts}, Options[ParallelTable]]]],
  Evaluate[FilterRules[{opts}, Options[ListAnimate]]]]

 

分类:函数 | 用户: EmberEdison (806 分)

1个回答

+3 投票
 
已采纳

第一个问题没法区分,因为这并不是mma的问题,是你在设计函数的时候自己没考虑到的问题。简化问题为:

Options[g] = {"a" -> 1};
Options[h] = {"a" -> 2};
f[x_, opts : OptionsPattern[]] := g[x, h[x, opts], opts]

g和h的选项一样,那么显然使用f[1,"a"->3]时mma无法猜测出你心中的想法,"a"到底是给g还是给h。
一种解决方法是,请主动告诉程序区分点是什么。

Options[g] = {a -> 1};
Options[h] = {a -> 2};
Options[f] = {a1 -> 1, a2 -> 2};

f[x_, opts : OptionsPattern[]] := 
 Module[{opts1, opts2, classifyOption},
  classifyOption[opt_, val_] := 
   Cases[opt, ((a_?(StringTake[ToString@#, -1] == val &)) -> 
       b_) :> (ToExpression@StringDrop[ToString@a, -1] -> b)];
  {opts1, opts2} = classifyOption[{opts}, #] & /@ {"1", "2"};
  g[x, h[x, opts1], opts2]
  ]
  
f[1, a1 -> 1, a2 -> 2]
f[1, a1 -> 1]
f[1, a2 -> 1]

 

用户: 苹果 (2.2k 分)
采纳于 用户:EmberEdison
...