【问题标题】:Symmetric matrix is not symmetric对称矩阵不是对称的
【发布时间】:2016-10-05 12:19:43
【问题描述】:

我最近为有限元法编写了代码。由于我的算法正在生成一个对称矩阵,因此在为每个元素收集数据后,生成的矩阵应该是对称的。

但是,在我对元素运行循环之后,生成的全局矩阵不是对称的。基本代码结构是这样的:

A=zeros(dof,dof)

for (each element)
    loc_A = v'*(diagonal matrix)*v
         % (v is 1xN row vector)
         % loc_A is symmetric matrix

    A(K,K) = A(K,K)+loc_A
                 % (K is Nx1 column vector)
end

由于我添加了对称矩阵,因此生成的矩阵也应该是对称的。

但是,生成的矩阵不是对称的(我使用issymmetric(A) 进行了检查)。我认为这是因为舍入错误。如果我添加 A=(A+A')/2,得到的矩阵是对称的(当然......)。但是我不想做这样的事情。是否有任何其他补救措施可以使A 自然对称而无需任何后处理?

【问题讨论】:

  • 你是正确的,对称矩阵的添加也会生成一个对称矩阵。您的理论是正确的,但我高度怀疑您的代码有问题。而不是伪代码,请向我们展示您正在使用的实际代码 sn-p。我的直觉是你没有正确编码。
  • 真正的问题是:矩阵非对称有多少?我的意思是(A-A.')/norm(A) 之类的东西。如果这非常小,请继续并手动将其对称。如果它不是很小,请找到您的错误。另外,请确保您的矩阵是真实的。
  • A(K,K) 不会像您认为的那样为您提供length(K) 元素。它为您提供KK 的所有排列。你想要A(sub2ind(size(A), K,K))
  • 也许这可能是问题所在:如果您正在处理复数,则转置 (') 与 (.') 不同。前者也共轭值。
  • 虽然您有如上所述的索引错误,但您的对角矩阵必须是标量。除此之外,对于其他情况,您可能希望将您的条目等同于而不是平均它们。使用(triu(A,1))' + triu(A)。因此,您有一个对称的数字错误污染了条目。

标签: matlab matrix symmetric


【解决方案1】:

这是由于舍入错误(除非您的代码中有明显的错误)。这个问题通常由A = (A+A')/2 解决(这不是一项昂贵的操作),或者您可以告诉求解器您的全局矩阵是对称的(一些求解器(即 MUMPS)有这样的选项。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多