生成严格对角占优矩阵

时间:2012-01-09 21:59:17

标签: matrix wolfram-mathematica

有没有办法在Mathematica中生成n strictly diagonally dominant的随机n? 我使用以下代码生成随机方阵:

A = RandomReal[{-100, 100}, {1000, 1000}]

编辑:我只需要一种方法来生成一个严格的对角占优矩阵,行随机性并不重要。

2 个答案:

答案 0 :(得分:7)

你可以对每一行的绝对值求和,并在对角线条目中添加相应对角线入口乘以其行和的符号。

In[457]:= SeedRandom[11111];
n = 5;

In[465]:= mat1 = RandomReal[{-100, 100}, {n, n}]

Out[465]= {{-47.2529, 53.4377, 28.6267, 
  69.098, -66.3035}, {71.5837, -38.9932, 66.885, -35.7296, 
  38.6584}, {-55.4822, -45.8442, 52.9929, 55.1683, 
  18.8236}, {12.2189, -47.5637, 36.1517, 88.7082, 
  95.101}, {-87.9987, -44.2326, -7.09374, -16.7852, 42.521}}

In[466]:= mat = 
 mat1 + DiagonalMatrix[(Total /@ Abs[mat1])*Sign[Diagonal[mat1]]]

Out[466]= {{-311.972, 53.4377, 28.6267, 
  69.098, -66.3035}, {71.5837, -290.843, 66.885, -35.7296, 
  38.6584}, {-55.4822, -45.8442, 281.304, 55.1683, 
  18.8236}, {12.2189, -47.5637, 36.1517, 368.452, 
  95.101}, {-87.9987, -44.2326, -7.09374, -16.7852, 241.152}}

这是否足以满足您的目的可能取决于您对“随机性”的要求。

答案 1 :(得分:1)

怎么样:

n = 5;
(a = Table[Random[], {n}, {n}]) // MatrixForm
Table[If[i == j, 
   a[[i, j]] = Total[Abs[a[[i, All]]]] - Abs[a[[i, j]]]], {i, 5}, {j, 
   5}];
a // MatrixForm

修改(1)

我在想,为了使上面的内容更加随机,我应该将对角线上生成的元素乘以另一个随机数> 1.否则,矩阵并不是真正随机的,因为人们可以通过对行上所有其他元素求和来计算对角线上的元素。

所以,这是上面的第2版

  n = 5;
  (a = Table[Random[], {n}, {n}]) // MatrixForm

  Do[
    Do[If[i == j, 
          a[[i, j]] = 
               RandomReal[{1, 10}]*(Total[Abs[a[[i, All]]]]-Abs[a[[i, j]]])
         ], 
      {i, 5}], 
    {j, 5}
   ];

 a // MatrixForm

矩阵仍然不是完全随机的,但至少比以前更随机:)

修改(2)

喝完咖啡后,我觉得我应该让上面的东西更有用!所以我重写了上面的内容,我认为这是一个更Mathematica /功能样式(没有明确的Do循环)。

这里是

scale = 2;
A = Table[RandomReal[], {3}, {3}]
A = ReplacePart[
  A, {{i_, i_}}:> RandomReal[{1, scale}]*(Total@Abs@A[[i, All]]-Abs@A[[i, i]])]

因此,在mat之前

 {{0.577887, 0.825449, 0.085029}, 
 {0.68226, 0.81484,0.903905}, 
 {0.289007, 0.642185, 0.598648}}
在垫子变成

之后

 {{1.74871, 0.825449, 0.085029}, 
  {0.68226, 2.15998,0.903905}, 
  {0.289007, 0.642185, 1.58928}}

我真的开始喜欢这种函数式编程方式。它似乎也使代码更短,这是我认为的好事。更少的代码意味着错误的可能性更小。