已编辑...
感谢每一个试图帮助我的人!
我正在尝试用Mathemetica做一个有限元分析。我们可以得到所有8x8维的局部刚度矩阵。我的意思是有2000个矩阵,它们是相似的,但并不相同。每个局部刚度矩阵都像一个函数一样,命名为KK。例如,KK1是第一元素局部刚度矩阵
我正在尝试将所有的局部矩阵组合起来,形成全局刚度矩阵。要使其简单,请执行以下操作:
Do[K[e][i][j]=KK[[e]][[i]][[j]],{e,2000},{i,8},{j,8}]....edited这是我的问题……这个等式可以影响分析time...If是的,我可以做些什么来改善这一点……
在matlab中,这被命名为3d数组,但我不知道在Mathematica中叫什么
在Mathematica...is t中这种解释类型的优点和缺点是什么?更快还是更简单?
谢谢你的帮助。
发布于 2015-05-22 20:47:50
很难理解你的问题是什么,所以你可能想要重新表述它。
正如其他人所提到的,从3D阵列切换到DownValues或SubValues不会带来任何好处。实际上,您将从访问数据结构转移到模式匹配,模式匹配很强大,也是Mathematica的真正优势,但对于您计划做的事情来说效率不是很高,所以我强烈建议您停留在普通数组的领域。
还有一件事可能对matlab比Mathematica更熟悉:在Mathematica中,数组的“默认”行为很像matlab中的单元格数组:每个条目可以包含任意内容,它们不需要是矩形的(正如High Performance Mark提到的,它们只是带有头部List的表达式,可以粗略地与matlab单元格数组进行比较)。但是,如果这样的嵌套列表是一个矩形数组,并且其中的每个元素都是相同类型的,那么这种数组就可以转换为所谓的PackedArrays。PackedArrays的内存效率更高,也会加速许多计算,它们在许多方面的行为就像matlab中的常规(“非单元格”)数组。这种转换通常是从Table这样的函数中隐式完成的,这些函数将自动返回压缩数组。但是,如果您对效率感兴趣,最好使用Developer`PackedArrayQ检查,并在必要时显式地使用Developer`ToPackedArray进行转换。如果您使用的是PackedArrays,那么许多操作的速度和内存效率都要好得多,而且通常可以与普通matlab数组上的矢量化操作相媲美。不幸的是,压缩的数组可能会被一些操作“解包”,所以如果计算变慢了,最好检查一下是否发生了这种情况。
无论是“普通”数组还是PackedArrays都不限制它们的秩(在Mathematica中称为Depth ),所以您当然可以创建和使用"3D数组“,就像在matlab中一样。在这样做的时候,我从来没有经历过,也不会知道任何效率惩罚。
可能有趣的是,较新版本的Mathematica (>= 10)将有限元方法作为NDSolve的求解器方法之一,因此,如果您不是作为练习来执行此操作的,您可能想看看已经有哪些可用的文档,关于它的文档非常多。
最后要说明的是,您可以使用可读性更好的kk[[e,i,j]]格式来代替kk[[e]][[i]][[j]],它也更容易输入,也不容易出错……
发布于 2015-05-22 00:41:56
我猜是扩展的评论,但是
KK[e][[i]][[j]]不是"3d数组“的(e,i,j)元素。请注意e上的单个括号。当您使用单括号时,您表示的不是数组或列表元素,而是DownValue,这与列表元素有很大不同。
例如,如果你这样做了,
f[1]=0
f[2]=2..。
生成的f看起来类似于数组,但实际上更类似于其他语言中的重载函数。这很方便,因为索引不需要是连续的,甚至不需要是整数,但如果您希望将结构作为列表进行操作,则会有一个明显的性能缺陷。
你的“do”循环示例几乎肯定会更好地写成:
kk = Table[ k[e][i][j] ,{e,2000},{i,8},{j,8} ](您的循环甚至不能按原样工作,除非您以前将每个kk[e]“初始化”为一个8x8数组。)
注意,现在列表元素都是用双括号括起来的,即kk[[e]][[i]][[j]]或kk[[e,i,j]]
https://stackoverflow.com/questions/30370699
复制相似问题