首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Mathematica中3d数组的优缺点是什么?

在Mathematica中3d数组的优缺点是什么?
EN

Stack Overflow用户
提问于 2015-05-21 18:10:20
回答 2查看 1.1K关注 0票数 0

已编辑...

感谢每一个试图帮助我的人!

我正在尝试用Mathemetica做一个有限元分析。我们可以得到所有8x8维的局部刚度矩阵。我的意思是有2000个矩阵,它们是相似的,但并不相同。每个局部刚度矩阵都像一个函数一样,命名为KK。例如,KK1是第一元素局部刚度矩阵

我正在尝试将所有的局部矩阵组合起来,形成全局刚度矩阵。要使其简单,请执行以下操作:

代码语言:javascript
复制
Do[K[e][i][j]=KK[[e]][[i]][[j]],{e,2000},{i,8},{j,8}]....edited

这是我的问题……这个等式可以影响分析time...If是的,我可以做些什么来改善这一点……

在matlab中,这被命名为3d数组,但我不知道在Mathematica中叫什么

在Mathematica...is t中这种解释类型的优点和缺点是什么?更快还是更简单?

谢谢你的帮助。

EN

回答 2

Stack Overflow用户

发布于 2015-05-22 20:47:50

很难理解你的问题是什么,所以你可能想要重新表述它。

正如其他人所提到的,从3D阵列切换到DownValuesSubValues不会带来任何好处。实际上,您将从访问数据结构转移到模式匹配,模式匹配很强大,也是Mathematica的真正优势,但对于您计划做的事情来说效率不是很高,所以我强烈建议您停留在普通数组的领域。

还有一件事可能对matlab比Mathematica更熟悉:在Mathematica中,数组的“默认”行为很像matlab中的单元格数组:每个条目可以包含任意内容,它们不需要是矩形的(正如High Performance Mark提到的,它们只是带有头部List的表达式,可以粗略地与matlab单元格数组进行比较)。但是,如果这样的嵌套列表是一个矩形数组,并且其中的每个元素都是相同类型的,那么这种数组就可以转换为所谓的PackedArraysPackedArrays的内存效率更高,也会加速许多计算,它们在许多方面的行为就像matlab中的常规(“非单元格”)数组。这种转换通常是从Table这样的函数中隐式完成的,这些函数将自动返回压缩数组。但是,如果您对效率感兴趣,最好使用Developer`PackedArrayQ检查,并在必要时显式地使用Developer`ToPackedArray进行转换。如果您使用的是PackedArrays,那么许多操作的速度和内存效率都要好得多,而且通常可以与普通matlab数组上的矢量化操作相媲美。不幸的是,压缩的数组可能会被一些操作“解包”,所以如果计算变慢了,最好检查一下是否发生了这种情况。

无论是“普通”数组还是PackedArrays都不限制它们的秩(在Mathematica中称为Depth ),所以您当然可以创建和使用"3D数组“,就像在matlab中一样。在这样做的时候,我从来没有经历过,也不会知道任何效率惩罚。

可能有趣的是,较新版本的Mathematica (>= 10)将有限元方法作为NDSolve的求解器方法之一,因此,如果您不是作为练习来执行此操作的,您可能想看看已经有哪些可用的文档,关于它的文档非常多。

最后要说明的是,您可以使用可读性更好的kk[[e,i,j]]格式来代替kk[[e]][[i]][[j]],它也更容易输入,也不容易出错……

票数 1
EN

Stack Overflow用户

发布于 2015-05-22 00:41:56

我猜是扩展的评论,但是

代码语言:javascript
复制
 KK[e][[i]][[j]]

不是"3d数组“的(e,i,j)元素。请注意e上的单个括号。当您使用单括号时,您表示的不是数组或列表元素,而是DownValue,这与列表元素有很大不同。

例如,如果你这样做了,

代码语言:javascript
复制
 f[1]=0
 f[2]=2

..。

生成的f看起来类似于数组,但实际上更类似于其他语言中的重载函数。这很方便,因为索引不需要是连续的,甚至不需要是整数,但如果您希望将结构作为列表进行操作,则会有一个明显的性能缺陷。

你的“do”循环示例几乎肯定会更好地写成:

代码语言:javascript
复制
 kk = Table[ k[e][i][j] ,{e,2000},{i,8},{j,8} ]

(您的循环甚至不能按原样工作,除非您以前将每个kk[e]“初始化”为一个8x8数组。)

注意,现在列表元素都是用双括号括起来的,即kk[[e]][[i]][[j]]kk[[e,i,j]]

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30370699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档