【问题标题】:Diagonalizing sparse unitary matrix对角化稀疏酉矩阵
【发布时间】:2017-02-27 19:31:10
【问题描述】:

我必须收集稀疏酉矩阵的特征值。 基本上只有一个元素不同于零 行和列(这是一些马尔可夫过程的传递矩阵)。

我的问题是如何进行,最好的选择是什么 在所有功能套件中。我已经看到 eigs 可以提供帮助, 但我也看到必须选择初始向量

【问题讨论】:

  • 矩阵的每一列和每一行是否有一个非零条目?在这种情况下,它是一个置换矩阵乘以一个扩张矩阵,并且特征值很容易计算(根据置换周期的复杂单位向量乘以扩张因子的适当比率)
  • 是的,事实上,它只是一个典型的置换矩阵。你怎么知道这个因式分解?如果存在退化(许多特征值等于 0)和/或向量空间的维度缩放为 N^2,它们是否仍然容易计算?

标签: julia sparse-matrix eigenvalue


【解决方案1】:

以下代码最终定义了pdeig,它返回一个矩阵的特征值,该矩阵是一个pdmatrix,即一个排列和对角矩阵的乘积,或者换句话说,一个像问题描述的矩阵。也可以快速计算特征向量(它们有一个明确的公式):

issquare(m) = all(x->x==size(m,1),size(m))
isunique(v) = v == unique(v)
permmatrix(sigma) = 
  [i==sigma[j] ? 1.0 : 0.0 for i=1:length(sigma),j=1:length(sigma)]
mat2perm(m) = [findfirst(m[:,i]) for i=1:size(m,1)]

function ispdmatrix(m)      # used to verify input matrix form
  (r,c,v) = findnz(m)
  return issquare(m) && isunique(r) && isunique(c)
end

function pdfact(m::Matrix)  # factor into permutation/dilation
  ispdmatrix(m) || error("input matrix must be a PD matrix")
  n = size(m,1)
  p = mat2perm(m)
  d = [p[i]>0 ? m[p[i],i] : zero(eltype(m)) for i=1:n]
  return (p,d)
end

# return eigenvalues from factored pdmatrix
function pdeig(p::Vector{Int},d::Vector)
  n = length(p)
  active = trues(n)
  eigv = Vector{Complex{eltype(d)}}(0)
  for i=1:n
    if !active[i]
      continue
    end
    if p[i]>0
      j=1
      cump = d[i]
      k=p[i]
      active[i]=false
      while active[k] > 0
        j+=1
        cump *= d[k]
        active[k] = false
        k=p[k]
      end
      append!(eigv,[cump^(1.0/j)*exp(2*im*π*m/j) for m=1:j])
    else
      push!(eigv,0.0 + 0.0im)
    end
  end
  return eigv
end

pdeig(m::Matrix) = pdeig(pdfact(m)...)

n = 4   # testing vector to matrix transformation of permutations
σ=randperm(n)
@assert mat2perm(permmatrix(σ))==σ

例如:

m = [ 0.0 1.0 0.0 ; 2.0 0.0 0.0 ; 0.0 0.0 0.0 ]
pdeig(m)

输出:

    3-element Array{Complex{Float64},1}:
 -1.41421+1.73191e-16im 
  1.41421-3.46382e-16im 
              0.0+0.0im

由于这些矩阵是可对角化的,特征值应该提供对角矩阵(只需在它们上使用diagm)。

这些矩阵非常结构化,适当的 Julia 处理将为这些矩阵定义一个类型,然后定义各种线性代数函数以在该类型上调度。

如果出现错误,只需添加评论,我会尝试修复它们(或者如果我碰巧看到一个不错的重构,那么我会编辑)。

顺便说一句,计算会引入小的数值误差,这些应该不是问题,可以通过适当的舍入来消除(所以不必害怕 -1.0-1.0+1.234234e-16im

【讨论】:

猜你喜欢
  • 2011-01-14
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
相关资源
最近更新 更多