找回密码
 注册
Simdroid-非首页
查看: 197|回复: 8

[编程进阶] 初学者对Mathematica一些问题的困惑,求坛里兄弟们解答。

[复制链接]
发表于 2011-8-15 19:33:34 | 显示全部楼层 |阅读模式 来自 北京
本帖最后由 后向散射模型 于 2011-8-15 19:41 编辑

因为研究的需要,需要学习Mathematica软件,最近一周在看一些资料,有些很初级的问题很困惑。因为初学,可能表达不是很清楚。还请坛里的有经验的兄弟能帮帮忙,解答一下,不甚感激。
1. 首先是符号的问题。看了一些资料,没有看到对Mathematica里面符号的运用说的很明白。
最让我困惑的是循环语句啊,条件语句中“;”和“,”的使用。不像C语言,语句结束就只用“;”,对符号的运用基本上都有限定的模板。
就我自己的理解“;”的作用感觉是不立即处理(就是写上一个语句,末尾+“;”摁Shift+Enter不会计算出结果)
类似于定义函数的时候“:=”的意义,不知道对不对。
比如定义Do型结构,它的一般形式是Do[body,{n}]
但一个文档上的例子:t=1; Do[t=t*k;Print[t];If[k<3,Continue[]];t=t+2,{k,5}]
又比如For[i=8,!PrimeQ,Print;i=i+1]
这些语句里面又是“;”又是“,” 根本不知道哪个时候用“;”,哪个时候用“,”。 这到底有什么区别。类似于循环语句中,分号,逗号分别起到什么作用?
其次还有{}和(),感觉()只在运算或者某几个函数组合在一起的时候用到,其他绝大多数情况下都用{},这些符号的运用是不是需要记忆?
2.关于写程序的问题。 我理解的程序包是一些函数的集合,类似于C++中的类。一旦定义好了,以后就能调用里面的函数用来功能的实现。有一个问题就是建立程序包的问题,是不是必须选择“文件-新建-程序包(.m)文件”,建立程序包然后保存。下次需要用的时候就“<<**Package”调用呢? 我老师给了我一些程序,是.nb格式的,也就是笔记本格式,我装的是8.0中文版,那程序是在老版本里面写的,内容是几个标题,每个标题下都有代码,然后第一个标题就是写的一个程序包,没有单独采取我上面的那种形式,下面的标题里面就直接调用程序包里设定的函数,这样也可以吗?更奇怪的是,一打开那个程序,没有"In
  • : Out
  • "这样的输入输出标识,但却用Show函数显示出了图形。这是怎么一回事?不是一般摁Shift+Enter就会出现那样的标识吗? 然后我在菜单栏上选择“计算-计算笔记本”才出现那样的标识,但"In
  • : Out
  • "却不是从"In[1]: Out[1]"开始的,也很奇怪。还有Mathematica的程序在笔记本里编写都没有像C,C++那样有运行,调试的标志,只能采取摁Shift+Enter,或者“计算-计算笔记本”这样的步骤出结果吗?Mathematica是不是不能编写像MFC那样有界面的程序,而只能像C那样类似于控制台的程序? 是不是只能编写出出计算结果,出出显示图像那样的程序?
    3.能不能把Mathematica程序改写成用Fortran或者C语言写的程序,生成.exe 的执行文件?困不困难?
    问题很初级,表达也不是很清楚流畅,希望弹力的兄弟帮忙解答一下,谢谢了!
  •  楼主| 发表于 2011-8-15 19:34:13 | 显示全部楼层 来自 北京
    Simdroid开发平台
    因为研究的需要,需要学习Mathematica软件,最近一周在看一些资料,有些很初级的问题很困惑。因为初学,可能表达不是很清楚。还请坛里的有经验的兄弟能帮帮忙,解答一下,不甚感激。
    1. 首先是符号的问题。看了一些资料,没有看到对Mathematica里面符号的运用说的很明白。
    最让我困惑的是循环语句啊,条件语句中“;”和“,”的使用。不像C语言,语句结束就只用“;”,对符号的运用基本上都有限定的模板。
    就我自己的理解“;”的作用感觉是不立即处理(就是写上一个语句,末尾+“;”摁Shift+Enter不会计算出结果)
    类似于定义函数的时候“:=”的意义,不知道对不对。
    比如定义Do型结构,它的一般形式是Do[body,{n}]
    但一个文档上的例子:t=1; Do[t=t*k;Print[t];If[k<3,Continue[]];t=t+2,{k,5}]
    又比如For[i=8,!PrimeQ,Print;i=i+1]
    这些语句里面又是“;”又是“,” 根本不知道哪个时候用“;”,哪个时候用“,”。 这到底有什么区别。类似于循环语句中,分号,逗号分别起到什么作用?
    其次还有{}和(),感觉()只在运算或者某几个函数组合在一起的时候用到,其他绝大多数情况下都用{},这些符号的运用是不是需要记忆?
    2.关于写程序的问题。 我理解的程序包是一些函数的集合,类似于C++中的类。一旦定义好了,以后就能调用里面的函数用来功能的实现。有一个问题就是建立程序包的问题,是不是必须选择“文件-新建-程序包(.m)文件”,建立程序包然后保存。下次需要用的时候就“<<**Package”调用呢? 我老师给了我一些程序,是.nb格式的,也就是笔记本格式,我装的是8.0中文版,那程序是在老版本里面写的,内容是几个标题,每个标题下都有代码,然后第一个标题就是写的一个程序包,没有单独采取我上面的那种形式,下面的标题里面就直接调用程序包里设定的函数,这样也可以吗?更奇怪的是,一打开那个程序,没有"In
    : Out
    "这样的输入输出标识,但却用Show函数显示出了图形。这是怎么一回事?不是一般摁Shift+Enter就会出现那样的标识吗? 然后我在菜单栏上选择“计算-计算笔记本”才出现那样的标识,但"In
    : Out
    "却不是从"In[1]: Out[1]"开始的,也很奇怪。还有Mathematica的程序在笔记本里编写都没有像C,C++那样有运行,调试的标志,只能采取摁Shift+Enter,或者“计算-计算笔记本”这样的步骤出结果吗?Mathematica是不是不能编写像MFC那样有界面的程序,而只能像C那样类似于控制台的程序? 是不是只能编写出出计算结果,出出显示图像那样的程序?
    3.能不能把Mathematica程序改写成用Fortran或者C语言写的程序,生成.exe 的执行文件?困不困难?
    问题很初级,表达也不是很清楚流畅,希望弹力的兄弟帮忙解答一下,谢谢了!
    回复 不支持

    使用道具 举报

     楼主| 发表于 2011-8-15 19:34:34 | 显示全部楼层 来自 北京
    1楼的字体太奇怪了 不知道怎么回事,兄弟们看看2楼
    回复 不支持

    使用道具 举报

    发表于 2011-8-15 22:51:30 | 显示全部楼层 来自 湖南长沙
    “;”代表一段程序未完,作用是运行语句但是不显示结果,什么都不加代表一段程序的结束,按shift+enter就会运行并且显示结果。“;”的作用和C应该是一样的
    Do语句的完整格式是
    Do[
    sentence1;sentence2;sentence3...
    ,{k,min,max,step}]
    你说的那个语句里有四句sentence,分别用三个“;”隔开,小括号里的变量k其实是缺省了min和step的。反正所有的“;”都表示并列依次运行。
    m文件应该是和记事本文件是一样的,在Matlab等其他软件里也可以调用,但是个人觉得更像是C++里的头文件,还是没有类那么好用。mathematic本来就是用C++写的,可以转换成其他语言,这个在帮助文档里见到过,但是我一直没有搞明白怎么转换,我也想知道

    评分

    1

    查看全部评分

    回复 不支持

    使用道具 举报

     楼主| 发表于 2011-8-16 09:05:34 | 显示全部楼层 来自 北京
    本帖最后由 后向散射模型 于 2011-8-16 09:17 编辑

    回复 4# FlyingDuckman

    泪流满面啊~第一个回复的 非常感谢。
    但是我还是有些不明白“;”和“,”的具体格式。
    比如上面那个句子:t=1; Do[t=t*k;Print[t];If[k<3,Continue[]];t=t+2,{k,5}]。 你说Do的格式为Do[
    sentence1;sentence2;sentence3...,{k,min,max,step}],句子于句子间用分号隔开,那我上句里面t=t+2,{k,5} 这里面的逗号又是怎么回事。 是不是一个句子里面有复合表达式就用逗号隔开,但句子与句子之间就用分号隔开?
    还有一个例子,文档上面说for的格式是For[start,test,incr,body],格式上都是用逗号隔开的,但例句却是For[i=8,!PrimeQ,Print;i=i+1],请问这个Ptint;后面的分号是怎么回事?和定义的标准格式不一样啊。还有个例句:For[i=1,i<5,A[]=2i;Print["a[",i,"]*“,a"];i++],这里面又是逗号,又是分号的,让人很不解。 到底什么时候该用“;”,什么时候用“,”呢? 不同的循环结构,条件结构,逗号,分号的使用不一样吗?
    回复 不支持

    使用道具 举报

    发表于 2011-8-16 09:27:52 | 显示全部楼层 来自 湖南长沙
    t=t+2,{k,5}里的“,”是用来隔开句子和变量用的,“t=t+2”实际上是sentence4,是和前面三句构成一个body。
    For[i=8,!PrimeQ,Print;i=i+1]这个句子里“i=8”是start,“!PrimeQ”是test,“Print;i=i+1”这整个就是body,incr部分缺省,你可以比较一下和For[i=8,!PrimeQ,i=i+1,Print]这个句子的区别。
    后面那个句子A[]=2i;Print["a[",i,"]*“,a"];i++这整个都是body
    不知道我表达明白了没有

    评分

    1

    查看全部评分

    回复 不支持

    使用道具 举报

     楼主| 发表于 2011-8-16 09:41:28 | 显示全部楼层 来自 北京
    回复 6# FlyingDuckman


        你这么说我明白了一些,incr是用来改变循环变量的,那个For循环句子里面相当于在body里面改变循环变量了。那说的那个比较,我刚运行了一下,是一样的结果。 那是不是这样:在一个循环结构里面,比如For循环,比如在它的start, body里面,在一个单独的start(或者body)里面,句子与句子之间用分号隔开,然后整体的start,test,incr,body用逗号隔开。 其他的循环结构也如此,对吗?
    回复 不支持

    使用道具 举报

    发表于 2011-8-16 11:01:45 | 显示全部楼层 来自 湖南长沙
    对的,大概就是这么个道理了,不过“;”隔开body比较多,那些判断条件一般用逻辑运算来隔开的
    回复 不支持

    使用道具 举报

    发表于 2011-8-18 11:26:42 | 显示全部楼层 来自 甘肃兰州
    照我的理解,分号表示同一级,一句话没说完;逗号表示下一步。
    比如
    1. For[x = 1; y = 2, x <= 5, x++, Print[{x, y}]]

    2. {1,2}

    3. {2,2}

    4. {3,2}

    5. {4,2}

    6. {5,2}
    复制代码
    里面的x=1与y=2同属于For语句的第一部分,用分号隔开,如果用逗号的话y=2就算作第二部分了。

    评分

    1

    查看全部评分

    回复 不支持

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

    GMT+8, 2024-4-26 18:18 , Processed in 0.050487 second(s), 19 queries , Gzip On, MemCache On.

    Powered by Discuz! X3.5 Licensed

    © 2001-2024 Discuz! Team.

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