有没有办法在Mathematica中生成n strictly diagonally dominant的随机n? 我使用以下代码生成随机方阵:
A = RandomReal[{-100, 100}, {1000, 1000}]
编辑:我只需要一种方法来生成一个严格的对角占优矩阵,行随机性并不重要。
答案 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}}
我真的开始喜欢这种函数式编程方式。它似乎也使代码更短,这是我认为的好事。更少的代码意味着错误的可能性更小。