Matrix 生成严格对角占优矩阵

Matrix 生成严格对角占优矩阵,matrix,wolfram-mathematica,Matrix,Wolfram Mathematica,有没有办法在Mathematica中生成一个n乘n的随机数? 我使用以下代码生成一个随机平方矩阵: A = RandomReal[{-100, 100}, {1000, 1000}] 编辑:我只需要一种方法来生成一个大的严格对角占优矩阵,行的随机性并不重要。您可以对每行的绝对值求和,并将相应对角线项的符号乘以其行和添加到该对角线项中 In[457]:= SeedRandom[11111]; n = 5; In[465]:= mat1 = RandomReal[{-100, 100}, {n,

有没有办法在Mathematica中生成一个n乘n的随机数? 我使用以下代码生成一个随机平方矩阵:

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

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

您可以对每行的绝对值求和,并将相应对角线项的符号乘以其行和添加到该对角线项中

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}}

这是否足以满足您的目的,可能取决于您在“随机性”方面想要什么。

您可以将每行的绝对值相加,并将相应对角线项的符号乘以其行和添加到该对角线项中

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}}
这是否足以满足您的目的,可能取决于您对“随机性”的要求。

如何:

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)

喝过咖啡后,我想我应该让上面的功能更强大!因此,我以我认为更为数学/函数式的风格重写了上面的内容(没有显式的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}}
我真的开始喜欢这种函数式编程方式了。它似乎还可以缩短代码,我认为这是一件好事。代码越少,出现错误的可能性就越小。

那么:

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)

喝过咖啡后,我想我应该让上面的功能更强大!因此,我以我认为更为数学/函数式的风格重写了上面的内容(没有显式的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}}

我真的开始喜欢这种函数式编程方式了。它似乎还可以缩短代码,我认为这是一件好事。代码越少,出现错误的可能性就越小。

如果它确实是随机的,那么如何指定矩阵应该具有您所要求的特殊属性?你不是在同时要求两件相互冲突的事情吗?@Nasser不是真的。我想要一个随机掷骰子
n。。。所有的
{1,2,3}
都是允许的,而不仅仅是其中的一个子集),这可以称为“更随机”,但是2。您还更改了矩阵元素的分布,使其不均匀(在骰子示例中,
1
2
3
的可能性不一样),这可能被解释为“不太随机”。当然,如果可能的结果集是无限的和“连续的”,就像在矩阵的情况下一样,那么这些东西就更难定义了,OP也没有精确地说明他需要什么样的分布。但是声称你使矩阵更随机可能会被误解如果它真的是随机的,那么你如何指定矩阵应该具有你所要求的特殊属性呢?你不是在同时要求两件相互冲突的事情吗?@Nasser不是真的。我想要一个随机掷骰子
n。。。所有的
{1,2,3}
都是允许的,而不仅仅是其中的一个子集),这可以称为“更随机”,但是2。您还更改了矩阵元素的分布,使其不均匀(在骰子示例中,
1
2
3
的可能性不一样),这可能被解释为“不太随机”。当然,如果可能的结果集是无限的和“连续的”,就像在矩阵的情况下一样,那么这些东西就更难定义了,OP也没有精确地说明他需要什么样的分布。但是声称你使矩阵更随机可能会被误解为“更随机”。我这样问是因为这句话很难量化,尤其是鉴于此。我同意这句话很难量化,这就是为什么我说的时候带着笑脸。但至少,将占主导地位的对角线元素乘以最后的一个随机数,会使其更随机。在后一种情况下,它将具有其所在行的精确和(仅满足DD条件),这不会使其真正随机,而在前一种情况下,它不太可能具有该和。在大多数情况下,它的总和将大于行的绝对总和,这取决于最后用来“随机化”它的RandomReal[]的分布。显然,结构化矩阵在某种意义上比非结构化矩阵的随机性要小,但结构通常只会减少可用的自由度。但是,在剩余空间内,可以获得随机性。对于对称/厄米特矩阵,随机版本不难生成。SDD,除了你所做的之外,我不太确定。要考虑的东西。定义“更随机”。我问这个问题是因为这个陈述很难量化,特别是考虑到这一点。我同意这个陈述很难量化,这就是为什么我说这个时带着笑脸的原因。但至少,将占主导地位的对角线元素乘以最后的一个随机数,会使其更随机。在后一种情况下,它将具有它所在行的精确总和(仅限我)