这是一个微不足道的问题,但我刚刚开始使用matlab,还没有习惯他们的思维方式(和语法)。
我的问题对于任何使用过有限元或类似方法的人来说都是显而易见的。
如何将几个小矩阵组合成一个大的刚度矩阵。比方说,对于(元素1),你得到了一个4x4的局部刚度矩阵,对于(元素2)也是如此--当然,只是矩阵不同,但仍然是4x4。
执行此操作的最简单方法是什么:
[|--------| 0 0 ]
[| | 0 0 ]
[| |--|-----|]
[|-----|--| |]
[0 0 | |]
[0 0 |--------|]
(a33+b11, a34+b12,
(a43+b12, a44+b22, ...)比如做一个“大的”?
发布于 2009-06-02 20:31:07
我想你的问题是:
A= 4x4 B= 4x4
C=A和B重叠的最终矩阵,应在重叠中求和。
执行以下操作:
C = zeros(6);
C(1:4,1:4) = A;
C(3:6,3:6) = C(3:6,3:6) + B;发布于 2009-06-02 23:28:59
刚度矩阵希望是稀疏的。真的是这样。重点是,这些大的刚度矩阵将以大量的零元素结束。因此,您需要在构建矩阵时考虑到这一点。好的是稀疏矩阵在matlab中得到了很好的支持。但您需要正确地使用它们。
其思想是将矩阵构建为行和列索引的列表,以及要插入到矩阵中的值。提前建立起这个列表。只有在最后才会调用sparse来实际构建矩阵本身。稀疏将自动对存在重叠的元素进行求和。
一旦构建了稀疏矩阵,就完全支持矩阵乘法和反斜杠等所有操作,并且与完整矩阵上的相同操作相比,可以非常快。当全局刚度矩阵可能为1e5x1e5或更大时,这一点尤其重要。
在某些情况下,对于大型矩阵,当矩阵的因式分解变得不可能时,您可能需要迁移到迭代求解器。
发布于 2009-06-02 23:30:58
只是为了好玩,这里有一个使用BLKDIAG的单行解决方案
C = blkdiag(A,zeros(2)) + blkdiag(zeros(2),B);https://stackoverflow.com/questions/941683
复制相似问题