数学研发论坛

 找回密码
 欢迎注册
查看: 3152|回复: 28

[讨论] 关于Mathematica软件的命令使用的讨论

[复制链接]
发表于 2013-10-16 11:02:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?欢迎注册

x
使用了Mathematica软件有一段时间了,发现用一些命令的组合可以实现一些比较基础的功能,但是觉得方法未必是最优的,希望大家能够讨论一下有没有更好的方法,不知道大家有没有兴趣。
Q1:
描述:已知一个List为si,列出每个元素出现的次数。
输入:si={1,2,1,1,"a",{2},1,2,2}
输出:so={{1, 4}, {2, 3}, {"a", 1}, {{2}, 1}}
方法:Map[{First[#], Length[#]} &, Split[Sort[si]]]
Q2:
描述:已知一个List为si和函数f,且f[x,y]==f[y,x],求Outer[f,si,si,1],但是,结果中不包括f[x,x],且f[x,y]和f[y,x]只出现一次。
输入:si={1,2,5}
输出:so={f[1, 2], f[1, 5], f[2, 5]}
方法:Map[f[si[[#[[1]]]], si[[#[[2]]]]] &, Subsets[Range[Length[si]], {2}]]
Q3:
描述:用第一个元素来汇总。
输入:si = {{1, 1}, {2, "Two"}, {3, 3}, {1, "One"}, {1, "yi"}, {2, "1+1"}, {5, "5th"}, {3, {"x", "x", "x"}}}
输出:so={{1, {1, "One", "yi"}}, {2, {"1+1", "Two"}}, {3, {3, {"x", "x", "x"}}}, {5, {"5th"}}}
方法:Map[{First[First[#]], Last[#]} &, Map[Transpose, Split[Sort[si], First[#1] == First[#2] &]]]

上面是3个例子,请大家看看。呵呵。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-10-16 15:13:51 | 显示全部楼层
  1. si = {1, 2, 1, 1, "a", {2}, 1, 2, 2};
  2. Tally[si]

  3. si = {1, 2, 5};
  4. f @@@ Subsets[si, {2}]
  5. f @@@ Table[If[i != j, j, Unevaluated[]], {i, Reverse@si}, {j, si}]

  6. si = {{1, 1}, {2, "Two"}, {3, 3}, {1, "One"}, {1, "yi"}, {2,  "1+1"}, {5, "5th"}, {3, {"x", "x", "x"}}};
  7. {#[[1, 1]], #[[;; , 2]]} & /@ GatherBy[si, First]
复制代码

评分

参与人数 1鲜花 +2 收起 理由
zhouguang + 2 谢谢,我都没见过这命令。呵呵。

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-10-17 10:12:13 | 显示全部楼层
Tally@{1,2,1,1,"a",{2},1,2,2}
运行结果:
{{1, 4}, {2, 3}, {"a", 1}, {{2}, 1}}

评分

参与人数 1鲜花 +2 收起 理由
zhouguang + 2 谢谢,学习了呢。

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-10-17 10:13:14 | 显示全部楼层
如何用mathematica软件统计表中的元素的个数
/forum.php ... &extra=page%3D1

昨天我就想回复你的!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2013-11-4 10:59:37 | 显示全部楼层
Q4:
描述:将数字转换为字母,FromCharacterCode。
输入:si={{65, {66, {70}, 69}}, 67}
输出:so={{"A", {"B", {"F"}, "E"}}, "C"}
Q5:
描述:在一定条件下,求f[x]。
输入:si=f,x。(要求在x之后除了回车没有任何字符。)
输出:so=f[x]
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-11-4 13:25:41 | 显示全部楼层
借楼提问:
怎么让Mathematica求多元多项式的指数
比如a x y + x 以x、y为未知数。Exponent[a x y + x, {x, y}]得到x、y各自独立结果,不是 2。

我现在采取换元{x->z x ,y->z y}再求Exponent[%,z]

点评

貌似Mathematica是个缺憾  发表于 2013-11-4 14:51
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-11-4 13:59:57 | 显示全部楼层
zhouguang 发表于 2013-11-4 10:59
Q4:
描述:将数字转换为字母,FromCharacterCode。
输入:si={{65, {66, {70}, 69}}, 67}

  1. Clear["Global`*"];(*Clear all variables*)
  2. fun[a0_]:=Module[{a=a0},
  3.                  If[Not@ListQ@a,(*如果a不是一个表*)
  4.                      FromCharacterCode@a,(*由数字到字母*)
  5.                      (*如果a是表,但是a的第一个元素不是表*)
  6.                      If[ListQ[a]&&(Not@ListQ@First@a),
  7.                          Join[List@FromCharacterCode@First@a,Map[fun,Rest@a]],
  8.                          Map[fun,a]
  9.                      ]
  10.                  ]
  11. ]
  12. si={{65, {66, {70}, 69}}, 67};
  13. Map[fun,si]
复制代码

结果:{{"A", {"B", {"F"}, "E"}}, "C"}
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-11-4 14:02:49 | 显示全部楼层
zhouguang 发表于 2013-11-4 10:59
Q4:
描述:将数字转换为字母,FromCharacterCode。
输入:si={{65, {66, {70}, 69}}, 67}
  1. si = {{65, {66, {70}, 69}}, 67};
  2. si /. x_Integer :> FromCharacterCode[x]

  3. Clear[f, g]
  4. f[x_?IntegerQ] := FromCharacterCode[x];
  5. f[x_] := x;
  6. f //@ si

  7. g[x_] := FromCharacterCode[x]
  8. g[x_List] := x
  9. g //@ si
复制代码

点评

Map[FromCharacterCode, si, {-1}] 竟然有这么多实现,强悍!  发表于 2013-11-4 14:46
判定一个是整数还是分数还是小数还是表的函数是????????  发表于 2013-11-4 14:42
你的代码看起来不错的样子,能解释一下吗?  发表于 2013-11-4 14:06

评分

参与人数 1威望 +6 鲜花 +6 收起 理由
wayne + 6 + 6 赞一个!

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-11-4 14:10:37 | 显示全部楼层
(*利用递归解决问题!*)
Clear["Global`*"];(*Clear all variables*)
fun[a0_]:=Module[{a=a0},
                 If[Not@ListQ@a,(*如果a不是一个表*)
                     FromCharacterCode@a,(*由数字到字母*)
                     (*如果a是表,但是a的第一个元素不是表*)
                     If[ListQ[a]&&(Not@ListQ@First@a),
                         Join[List@FromCharacterCode@First@a,Map[fun,Rest@a]],
                         (*如果a是表,且a的第一个元素还是表*)
                         Map[fun,a]
                     ]
                 ]
]
si={{65, {66, {70}, 69}}, 67};
Map[fun,si]
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-11-4 14:33:15 | 显示全部楼层
第二个版本的代码
(*利用递归解决问题!*)
Clear["Global`*"];(*Clear all variables*)
fun[a0_]:=Module[{a=a0},
                 If[Not@ListQ@a,(*如果a不是一个表*)
                     FromCharacterCode@a,(*由数字到字母*)
                     Prepend[Map[fun,Rest@a],fun@First@a],
                 ]
]
si={{65, {66, {70}, 69}}, 67};
Map[fun,si]

评分

参与人数 1威望 +2 金币 +2 贡献 +2 经验 +2 鲜花 +2 收起 理由
chyanog + 2 + 2 + 2 + 2 + 2 赞一个!

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2019-11-12 11:58 , Processed in 0.070148 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表