在Mathematica中,几乎所有命令都自动在列表上穿线(或映射)。
在Maple中,如何确定哪个命令自动作用于列表或集合的条目?
例如:
y+p*x=2*sqrt(x*y);
r:=[solve(%,y)];
这给出了两个条目的列表(解决方案)
#r := [-p*x+(2*(1+sqrt(1-p)))*x, -p*x+(2*(1-sqrt(1-p)))*x]
现在我发现collect
自动映射到每个列表条目
collect(r,x);
# [(-p+2+2*sqrt(1-p))*x, (-p+2-2*sqrt(1-p))*x]
但是另一个命令没有(我只是选择了这个命令)
MmaTranslator[Mma][LeafCount](r);
#37
对于上述情况,需要显式遍历列表或集合的条目。
map(MmaTranslator[Mma][LeafCount],r)
#[17, 19]
在Maple中是否有一种方法可以找到哪个命令自动遍历列表或集合的条目,而不是反复试验?
枫树2018.1
答案 0 :(得分:4)
我不知道文档中的哪个地方确切说明了哪些命令会自动映射到列表上。
但是此类命令的集合并不大。绝大多数命令不会自动映射到列表。自动映射到列表的大多数与表达式的简化或相关操作有关。自动映射到列表的命令集合至少包含以下内容:
collect, combine, expand,
evala, evalc, evalf,
factor, normal, radnormal, rationalize, simplify
与使用map
命令进行显式包装相比,为这些命令提供自动映射列表最方便的是提供较短的语法。
还有一些命令可以保留结构(除非明确 通过选项告诉我们,外部列表结构是要更改的东西),因此对于列表而言,通常完成与映射到列表相同的事情:
convert, eval, evalindets, subs, subsindets
现代槭树有另一种较短的语法,可以将命令映射到列表(或集合,向量等)上。它被称为“ elementwise”操作,其语法包括在命令后附加~
(波浪号)。
例如,
discont~( [ csc(x), sec(x) ], x );
[{Pi _Z1~}, {Pi _Z2~ + 1/2 Pi}]
就您的其他示例而言,请注意LeafCount
为被视为单个 expression 的第一个参数计算一个值(度量)。但是项目列表仍然是单个 expression 。因此,它(不带~
)作为一个整体作用于列表,而不是自动映射在列表上,这并不奇怪。它将包围列表计为一个额外的“叶子”。
MmaTranslator:-Mma:-LeafCount( L0 );
8
L0 := [ sin(x), 1/2*x*cos(x) ]:
MmaTranslator:-Mma:-LeafCount~( L0 );
[2, 5]
map( MmaTranslator:-Mma:-LeafCount, L0 );
[2, 5]
对于与原始示例相似的示例,应用collect
(会自动映射)并使用collect~
逐元素地应用它没有区别。在这里,前两个结果是相同的,因为附加参数x
恰好是一个标量。例如,
r := [p*x+(2*(x^2+p^2))*x, p*x+(2*(x^2-p^2))*x]:
collect(r, x);
3 2 3 2
[2 x + (2 p + p) x, 2 x + (-2 p + p) x]
collect~(r, x);
3 2 3 2
[2 x + (2 p + p) x, 2 x + (-2 p + p) x]
map(collect, r, x);
3 2 3 2
[2 x + (2 p + p) x, 2 x + (-2 p + p) x]
我应该提到,如果第二个参数是诸如[x,p]
之类的列表而不是诸如x
之类的标量,则上述示例的行为将有所不同。
s := [a*b+(2*(a^2*b+b^2))*a, a*b+(2*(a^2*b-b^2))*a]:
collect(s, [a,b]);
3 2 3 2
[2 b a + (2 b + b) a, 2 b a + (-2 b + b) a]
map(collect, s, [a,b]);
3 2 3 2
[2 b a + (2 b + b) a, 2 b a + (-2 b + b) a]
collect~(s, [a,b]);
3 2 2 3
[2 b a + (2 b + b) a, -2 a b + (2 a + a) b]
zip(collect, s, [a,b]);
3 2 2 3
[2 b a + (2 b + b) a, -2 a b + (2 a + a) b]
在上面,当第二个参数也是列表时,基本collect~
示例的行为类似于zip
。也就是说,第一个参数中的第一项与第二个参数中的第一项被收集在一起,第一个参数中的第二项与第二个参数中的第二项收集在一起。
elementwise运算符语法的另一个功能是,它不将命令映射到标量表达式的操作数(即,不是列表,集合,Vector等)。与map
形成鲜明对比,map
可用于在表达式的操作数上映射操作。
在以下两个示例中,~
将命令应用于标量表达式的操作数,而使用元素方式T := x^2 * sin(x) + y^2 * cos(x):
F( T );
2 2
F(x sin(x) + y cos(x))
F~( T );
2 2
F(x sin(x) + y cos(x))
map( F, T );
2 2
F(x sin(x)) + F(y cos(x))
G( arctan(a, b) );
G(arctan(a, b))
G~( arctan(a, b) );
G(arctan(a, b))
map( G, arctan(a, b) );
arctan(G(a), G(b))
则将命令仅应用于标量表达式本身。在第一个示例中,操作数是项之和的和。在第二个示例中,操作数是未求值的函数调用的参数。
~
因此,如果您不希望在标量表达式的操作数(加数,被乘数等)上无意间映射命令,则可以使用元素级F( T, a );
F(sin(x) + cos(x), a)
F~( T, a );
F(sin(x) + cos(x), a)
map( F, T, a );
F(sin(x), a) + F(cos(x), a)
F( T, [a,b] );
F(sin(x) + cos(x), [a, b])
map( F, T, [a,b] );
F(sin(x), [a, b]) + F(cos(x), [a, b])
F~( T, [a,b] );
[F(sin(x) + cos(x), a), F(sin(x) + cos(x), b)]
zip( F, T, [a,b] );
[F(sin(x) + cos(x), a), F(sin(x) + cos(x), b)]
语法,而不必先测试是否第一个表达式是标量或列表(等)。
同样,如果还有其他参数,则是否为列表的标量也会有所不同。
{{1}}