指定矩阵形状

Specifying Matrix Shape

提问人:Smewai 提问时间:11/17/2023 更新时间:11/17/2023 访问量:33

问:

有没有办法在使用函数特征值查找矩阵的特征值之前指定矩阵是厄米特矩阵?

我有以下过程,它创建了一个矩阵,该矩阵是另一个实矩阵的总和,并且它被转置除以 2。

GOE := proc(N::integer) 
  local R, eigenSequence, i; 
  global H; 
  R := Matrix(N, N, Generate(distribution(Normal(0, 1)), makeproc = true));
  H := 1/2*R + 1/2*R^%T; 
  print(IsMatrixShape(H, Symmetric)); 
  return (eigenSequence := ([seq(Eigenvalues(H)[i], i = 1 .. N)])/(2*N)^0.5); end proc;
GOE(5);
                             false

    [-0.994570000000000 + 0. I, 0.468840000000000 + 0. I, 

      0.391240000000000 + 0. I, -0.0636860000000000 + 0. I, 

      -0.286700000000000 + 0. I]

尽管 H 是 Hermitian,但返回 .有什么方法可以明确地告诉 Maple H 是 Hermitian?IsMatrixShape(H, Symmetric)false

任何帮助将不胜感激。

矩阵 枫木

评论


答:

0赞 acer 11/17/2023 #1

您可以将 的构造包装在对命令的调用中,给出选项,HMatrix

shape=symmetric   (or hermitian)

该命令知道在这种情况下的结果将完全是真实的。Eigenvalues

为了安全起见,我引用了一些名称,以防您还为更高级别的关键字分配了关键字。

您可以通过在除以 2 之前加法来保存矩阵标量乘法。R+R^%T

例如

GOE := proc(N::posint) 
  local R, i;
  global H;
  R := Statistics:-Sample(Normal(0, 1), [N,N]);
  H := Matrix((R + R^%T)/2, 'shape'=':-symmetric'); 
  print(IsMatrixShape(H, ':-symmetric')); 
  return [seq(LinearAlgebra:-Eigenvalues(H)/(2*N)^0.5)];
end proc:

GOE(5);

                          true

 [-0.6534952738123082, -0.48271907292646454, 

  -0.08120522250873016, 0.46015902976640316),

   0.9573556811378775]

您的代码片段省略了 and 包的任何加载,因此不会像您提供的那样独立运行。最好在过程中使用长格式名称,或者在其中使用命令,而不是让过程的功能依赖于在顶层首次调用。LinearAlgebraRandomToolsuseswith

如果你的Maple版本很旧,那么我给出的命令用法(直接在结果Vector上)可能需要调整。seqEigenvalues

对于更大的示例,我相信该命令可能优于您对包的使用(而且更简单,IMO)。Statistics:-SampleRandomTools

例如

GOE := proc(N::posint) 
  local R, i;
  global H;
  uses LinearAlgebra, Statistics;
  R := Sample(Normal(0, 1), [N,N]);
  H := Matrix((R + R^%T)/2, 'shape'=':-symmetric'); 
  print(IsMatrixShape(H, ':-symmetric')); 
  return convert(Eigenvalues(H)/(2*N)^0.5, list);
end proc:

我还建议你把你的过程和结果都返回回来,而不是写信给一个如果你不在顶级操作,那就更笨拙了。Hglobal

GOE := proc(N::posint) 
  local H, R, i;
  uses LinearAlgebra, Statistics;
  R := Sample(Normal(0, 1), [N,N]);
  H := Matrix((R + R^%T)/2, 'shape'=':-symmetric'); 
  print(IsMatrixShape(H, ':-symmetric')); 
  return H, convert(Eigenvalues(H)/(2*N)^0.5, list);
  end proc:

H,res := GOE(5):
res;
H;