как насчет:
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
edit (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
Матрица все еще не совсем случайна, но, по крайней мере, немного более случайна, чем раньше:)
edit (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}}
Мне действительно начинает нравиться этот способ функционального программирования.Похоже, что это также делает код короче, и я думаю, что это хорошо.Чем меньше кода, тем меньше вероятность ошибки.