如何解决拉出减号以获得统一列表?
| 给出以下列表:{a + b,c + d + e,- a + b,a - b,- c - d - e}
我想得到的结果是:
{a + b,c + d + e}
需要说明的是:我想对第一个列表进行转换,以使每个元素中的第一个项标准化为加号,并丢弃所有可以从最终结果中获得的元素,并乘以-1
。
我尝试了Collect[]
和FactorTerms[]
以及其他一些看起来很像我可以做我需要的功能的函数,但它们从未碰过负号...。
任何帮助是极大的赞赏。
解决方法
使用
FactoredTermsList
:
In[5]:= FactorTermsList /@ {a + b,c + d + e,-a + b,a - b,-c - d - e}
Out[5]= {{1,a + b},{1,c + d + e},{-1,a - b},c + d + e}}
In[6]:= DeleteDuplicates[%[[All,2]]]
Out[6]= {a + b,a - b}
, 如果第一个元素的句法符号为负,则将其替换为负。然后参加工会。例:
ll = {a + b,-c - d - e}
Out[444]= {a + b,-c - d - e}
Union[Map[
If[Head[#] === Plus && Head[#[[1]]] === Times &&
NumberQ[#[[1,1]]] && #[[1,1]] < 0,Expand[-#],#] &,ll]]
{a - b,a + b,c + d + e}
丹尼尔·里奇布劳
, 看来您想消除以总符号为模的重复元素。至少在此特定情况下,以下将起作用:
In[13]:= Union[FullSimplify@Abs[{a + b,-c - d - e}]] /.
Abs[x_] :> x
Out[13]= {a - b,c + d + e}
如果列表中元素的顺序很重要,则可以使用ѭ9代替Union
。
, 这是一个尝试。
ClearAll[nTerm];
nTerm[t_] := If[MatchQ[t[[1]],Times[-1,_]],-t,t]
旨在映射到列表上;接受(列表中的)单个项目作为输入,如果第一个元素带有负号,则将其替换为负数。因此nTerm[-a + b + c]
给出a - b - c
,而nTerm
则保持不变:nTerm[a - b - c]
给出了其自变量。
下一个,
ClearAll[removeElements];
removeElements[lst_] :=
DeleteDuplicates[lst,(#1 \\[Equal] #2) || (#1 \\[Equal] -#2) &]
以列表作为参数,通过否定删除可能从另一个列表元素获得的那些列表元素:removeElements[{1,2,3,-2,a,-a,\"GWB\",-\"GWB\"}]
给出{1,\"GWB\"}
(!)。最后,
ClearAll[processList];
processList[lst_] := removeElements[nTerm /@ lst]
将整个批次应用于输入清单;因此,li = {a + b,-c - d - e}; processList[li]
等于{a + b,a - b}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。