相关疑难解决方法(0)

防止Mathematica中的运行时错误雪崩

当笔记本超出一些功能时我遇到的一个典型情况 - 我评估一个表达式,但是我得到了Beep而不是正确的答案,然后是几十个无用的警告,接着是"进一步输出...将被抑制"

我觉得有用的一件事 - 在函数内部使用类似Python的"断言"来强制内部一致性.还有其他提示吗?

Assert[expr_, msg_] := If[Not[expr], Print[msg]; Abort[], None]
Run Code Online (Sandbox Code Playgroud)

编辑11/14 警告雪崩的一般原因是子表达式评估为"坏"值.这会导致父表达式计算为"坏"值,并且此"不良"会一直传播到根目录.内置评估一路上注意到不良并产生警告."坏"可能意味着表达错误的头部,列表中的元素数量错误,负的确定矩阵而不是正定义等等.一般来说,它不适合父表达式的语义.

解决这个问题的一种方法是重新定义所有函数,以便在"输入错误"时返回未评估的值.这将处理内置函数生成的大多数消息.执行像"Part"这样的结构操作的内置函数仍将尝试评估您的值并可能产生警告.

将调试器设置为"中断消息"可以防止出现大量错误,尽管将其一直打开似乎有点过头了

wolfram-mathematica

13
推荐指数
2
解决办法
1386
查看次数

增加功能

所以一般来说,如果你有两个函数f,g:X - > Y,并且如果在Y上定义了一些二元运算+,那么f + g的规范定义为函数x - > f(x)+ G(X).

在Mathematica中实现这个的最佳方法是什么?

f[x_] := x^2
g[x_] := 2*x
h = f + g;
h[1]
Run Code Online (Sandbox Code Playgroud)

产量

(f + g)[1]
Run Code Online (Sandbox Code Playgroud)

作为输出

当然,

H = Function[z, f[z] + g[z]];
H[1]
Run Code Online (Sandbox Code Playgroud)

收益率为3.

wolfram-mathematica

11
推荐指数
2
解决办法
1818
查看次数

当DownValues已经存在时,可以阻止OwnValues吗?

对于已经分配了与名称"a"关联的DownValues的情况,是否有可接受的方法来阻止将OwnValues分配为相同的名称?(我最初在玩某人试图实现数据字典的时候遇到过这个问题.)

这就是我要避免的意思:

Remove[a];
a[1] := somethingDelayed
a[2] = somethingImmediate;
DownValues[a]
a[1]
a[2]
Run Code Online (Sandbox Code Playgroud)

返回...

{HoldPattern[a[1]] :> somethingDelayed, 
 HoldPattern[a[2]] :> somethingImmediate}
somethingDelayed
somethingImmediate
Run Code Online (Sandbox Code Playgroud)

现在,如果我们要评估:

a = somethingThatScrewsUpHeads;
(* OwnValues[a] above stored in OwnValues *)
a[1]
a[2]
Run Code Online (Sandbox Code Playgroud)

我们得到......

somethingThatScrewsUpHeads[1]
somethingThatScrewsUpHeads[2]
Run Code Online (Sandbox Code Playgroud)

是否有一种简单/灵活的方法来防止DownValues中任何名称的OwnValues?(Lemme猜测......这是可能的,但会有性能受损吗?)

wolfram-mathematica variable-assignment

9
推荐指数
2
解决办法
887
查看次数

模式仅匹配某些元素的"子元素"

我希望能够拥有一个模式,该模式只匹配某些其他元素的子项(可选地:不是).

例如,匹配List不在Graphics对象内的所有s 的模式:

{ {1,2,3}, Graphics[Line[{{1,2},{3,4}}]] }
Run Code Online (Sandbox Code Playgroud)

这种模式会匹配{1,2,3}但不匹配{{1,2},{3,4}}.

有相对简单的方法来提取符合这些条件的表达式,但模式不仅用于提取,还用于替换,这是我的主要用例here(ReplaceAll).

你知道任何简单,简洁和一般的方法吗?

只用模式就可以做到这一点吗?

wolfram-mathematica pattern-matching

8
推荐指数
2
解决办法
753
查看次数

重载集[a,b](a = b)

我想重载Mathematica的Set函数(=),这对我来说太棘手了(参见下面的代码示例).我成功地重载了其他函数(例如代码示例中的Reverse).有什么建议?

In[17]:= ClearAll[struct];

In[18]:= var1=struct[{1,2}]
Out[18]= struct[{1,2}]

In[19]:= Reverse@var1
Out[19]= struct[{1,2}]

In[20]:= Head[var1]
Out[20]= struct

In[21]:= struct/:Reverse[stuff_struct]:=struct[Reverse@stuff[[1]]]

In[22]:= Reverse@var1
Out[22]= struct[{2,1}]

In[23]:= struct/:Set[stuff_struct,rhs_]:=Set[struct[[1]],rhs]

In[24]:= var1="Success!"
Out[24]= Success!

In[25]:= var1
Out[25]= Success!

In[26]:= Head[var1]
Out[26]= String

In[27]:= ??struct
Global`struct
Reverse[stuff_struct]^:=struct[Reverse[stuff[[1]]]]

(stuff_struct=rhs_)^:=struct[[1]]=rhs
Run Code Online (Sandbox Code Playgroud)

wolfram-mathematica

3
推荐指数
1
解决办法
444
查看次数