...编辑
感谢每一个人试图帮助我!!!
我正在尝试在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中这种解释类型有哪些优点和缺点...更快或更容易
感谢您的帮助......
答案 0 :(得分:1)
很难理解你的问题是什么,所以你可能想重新制定它。
正如其他人所提到的,从3D阵列切换到DownValues
或SubValues
没有任何好处。实际上,您将从访问数据结构转移到模式匹配,这是Mathematica的强大和真正的优势,但对于您打算做的事情并不是非常有效,所以我强烈建议保持普通数组的范围。 / p>
对于更熟悉matlab而不是Mathematica的人来说,还有另外一件事可能不太清楚:在Mathematica中,"默认"对于数组行为很像matlab中的单元格数组:每个条目都可以包含任意内容,并且它们不需要是矩形的(因为高性能标记已经提到它们只是具有头部List
的表达式并且可以大致与matlab单元阵列进行比较)。但是,如果这样的嵌套列表是一个矩形数组,并且它的每个元素都是相同的类型,那么这些数组可以转换为所谓的PackedArrays
。 PackedArrays
具有更高的内存效率,并且还可以加速许多计算,它们在许多方面表现得像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]]