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

时间:2015-05-21 10:10:20

标签: arrays matlab matrix 3d wolfram-mathematica

...编辑

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

我正在尝试在Mathemetica中进行有限元分析....我们可以获得具有8x8维度的所有局部刚度矩阵。我的意思是有2000个矩阵它们相似但不相同。每个局部刚度矩阵都显示为名称为KK的函数。例如,KK [1]是第一个元素局部刚度矩阵

我正在尝试组装所有局部矩阵以制作全局刚度矩阵。为了方便起见:

Do[K[e][i][j]=KK[[e]][[i]][[j]],{e,2000},{i,8},{j,8}]....edited

这是我的问题......这种平等会影响分析时间......如果是,我该怎样做才能改善这一点......

在matlab中

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

Mathematica中这种解释类型有哪些优点和缺点...更快或更容易

感谢您的帮助......

2 个答案:

答案 0 :(得分:1)

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

正如其他人所提到的,从3D阵列切换到DownValuesSubValues没有任何好处。实际上,您将从访问数据结构转移到模式匹配,这是Mathematica的强大和真正的优势,但对于您打算做的事情并不是非常有效,所以我强烈建议保持普通数组的范围。 / p>

对于更熟悉matlab而不是Mathematica的人来说,还有另外一件事可能不太清楚:在Mathematica中,"默认"对于数组行为很像matlab中的单元格数组:每个条目都可以包含任意内容,并且它们不需要是矩形的(因为高性能标记已经提到它们只是具有头部List的表达式并且可以大致与matlab单元阵列进行比较)。但是,如果这样的嵌套列表是一个矩形数组,并且它的每个元素都是相同的类型,那么这些数组可以转换为所谓的PackedArraysPackedArrays具有更高的内存效率,并且还可以加速许多计算,它们在许多方面表现得像matlab中的常规(" not-cell")数组。这种转换通常是从Table等函数隐式完成的,它会自动返回一个压缩数组。但是,如果您对效率感兴趣,最好与Developer`PackedArrayQ核对,并在必要时使用Developer`ToPackedArray明确转换。如果您正在使用PackedArrays速度和许多操作的内存效率要好得多,并且通常与普通matlab数组上的验证操作相当。不幸的是,打包的阵列可能会被打开"解压缩"通过某些操作,所以如果计算变慢,通常最好检查是否已经发生。

没有"正常"数组和PackedArrays在他们可以拥有的等级(在Mathematica中称为Depth)中受到限制,因此您当然可以创建和使用" 3D数组"就像你在matlab中一样。在这样做的时候,我从未经历或将会知道任何效率惩罚。

可能有趣的是,较新版本的Mathematica(> = 10)将有限元方法作为NDSolve的解算器方法之一,所以如果你不是这样做的练习你可能想要的看看已经有的东西,有关于它的相当多的文档。

最后一点是,您可以代替kk[[e]][[i]][[j]]使用更易读的格式kk[[e,i,j]],这种格式也更容易且不易出错...

答案 1 :(得分:0)

我猜是扩展评论,但是

 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]]