现在满脑子都是无穷无尽的{{{{}}}},要爆了
mathematica吧
全部回复
仅看楼主
level 1
我感觉MMA可以改名叫{}语言,这个{}对初学者来说,太多太多的坑了。
第一个坑,{1,2},你以为它是一个1X2的矩阵,也就是传统语言里面那种一行的数组,错,MMA里面它是一个2X1的矩阵,要想得到真正的一维数组,要写成{{1,2}},也就是再套一对{}。
第二个坑,函数调用的时候,{}层数必须要数清楚,否者结果就是错的。比如
Transpose[{{{1,2},{3,4}}}],很简单的转置操作,你以为它的结果是{{{1,3},{2,4}}},错,结果是什么都不变,{{{1,2},{3,4}}}。因为多了一层{}
接下来换种方式,定义m1={{1,2}},m2={{3,4}}。
Transpose[{m1,m2}],中套了,这样就会和上面一样,输出什么都不变的结果。而Tr函数又必须要求参数套上{}作为一个组传进去,所以这个套对这样两个矩阵的混合转置,还是一点办法都么有。。
MMA,酷刑语言
2022年06月26日 08点06分 1
吧务
level 10
「第一个坑」:我不清楚你在什么地方被要求把一维数组写成列矩阵了。你最好拿个例子出来,否则看上去很可疑,我不知道有这种情况。
「第二个坑」:张量运算的数学规定就是如此,任何软件都应当如此设计。
「中套了」:你只会{}括起来这种升张量阶数的结构操作,那自然是要中套的,但没有设计者需要为你这种中套负责。
2022年06月26日 09点06分 2
基本可以肯定LZ是在基于MATLAB语法猜测Mathematica语法(搞了那种设计的好像就MATLAB一家),参9楼。
2022年07月02日 04点07分
level 1
回老大,因为我现在是在学习期,所以大量的做各种乱七八糟的试验,比如第一个坑我就是在测试Transpose的时候,有时候用{}不行,必须用{{}}传参。
不过今天下来,脑子稍微又清晰了一些。面对特别复杂的矩阵,必须是用MatrixForm把{{}{}}表达式转换成肉眼直观的矩阵格式,然后仔细研究构造,进而构思代码,否则矩阵一旦复杂,变成{{{{{}{}{}}}}}这样的形式,估计就算Wolfram自己来都要被搅晕过去。
菜鸟艰难的学习中。。。。
2022年06月26日 16点06分 3
吧务
level 12
1. 一维列表在参与矩阵乘法时,既可以作为行向量,也可以作为列向量
In[10]:= Array[a,{3,2}].{1,2}
Out[10]= {a[1,1]+2 a[1,2],a[2,1]+2 a[2,2],a[3,1]+2 a[3,2]}
In[11]:= {1,2}.Array[a,{2,3}]
Out[11]= {a[1,1]+2 a[2,1],a[1,2]+2 a[2,2],a[1,3]+2 a[2,3]}
2. 想达成你的目标,可以用
Transpose[Join[m1, m2]]

Transpose[ArrayFlatten[{{m1}, {m2}}]]

Transpose[{m1, m2}, {3, 1, 2}]
前两个都是把{m1, m2}转换为二维后转置,第三个则是直接转置高维列表
归根结底,mma这些在你看来“中套”的操作实质上都是为了保证语法在高维列表中保持一致与严谨。你可以想象一下,如果按照你设想中的语法,在处理高维列表时会有多少令人头疼的情况
按我个人的经验,如果只和矩阵打交道的话,mma的语法确实是不如matlab用起来顺手。但如果需要处理高维列表,mma语法上的一致性还是非常让人舒服的。建议根据自己的需求选择适合自己的工具吧
2022年06月26日 18点06分 6
[玫瑰]瓜哥跑丹麦去了?[笑眼]不知道IP地址准不准,上楼的竟然是塞舌尔,我也是学习了。[笑眼]
2022年06月28日 13点06分
level 4
而我认为可以叫[]语言
2022年06月26日 18点06分 7
level 2
所以说LISP是不是可以叫()语言[滑稽]
2022年06月29日 10点06分 8
吧务
level 15
@无影东瓜 实质上已经在6楼点破了问题的本质,不过说得还不够明确,这里再补充下:LZ你是有且只有一点MATLAB经验吧?如果是的话,请记住:奇怪的不是Mathematica,是MATLAB,因为它采用了一切以矩阵(形状规则的二维表)为中心的设计,所有语法都是以“便利地生成矩阵”为前提的,相应的,也就放弃了一定的“规范性”。
现在看这帖的想必也有不懂MATLAB核心语言的人,那随便举几个例子。先从简单的说起。用 [] 和 ; 输入一个二维表,输出是个二维表,
或者也可以
这很自然,然而也就到此为止了。使用 [] 输入一个“一维表”,MATLAB照样会把它认成“二维表”(依输入方式不同,它的行数或列数会是1——这就是你在顶楼第2段想干的事吧):
而在Mathematica里,类似的语法只会生成一维表:
这还没完。即使你输入的是个常量,MATLAB照样会把它当成1行1列的矩阵,并且这个“把常量当矩阵”的处理是无限进行的:
而在Mathematica里,标量就是标量,不会被认成列表,用Dimensions检查,输出也是{}:
当 [] 括起来的“东西”不是标量时(这说法其实不太准确,由上面的叙述我们已经知道,标量在MATLAB里也是矩阵),MATLAB也会尽可能地把输入往矩阵变换,比如
而Mathematica不会,它只会认为你生成了一个含有两个矩阵的表:
如之前的回复所说,Mathematica的这种嵌套逻辑可以非常自然地推广至n维列表。
MATLAB这种设计自然有它的道理。既然在实践中二维表用得多,那么让它的输入和转换方便一些也没什么不好。便利与规范不可兼得,Mathematica里也有很多类似的设计。但是,如果觉得MATLAB那种设计才叫正常,那我只能说你属实是被PUA了。
2022年07月02日 04点07分 9
……打错字了,“常量”应为“标量”
2022年07月02日 09点07分
1