Генерация строго диагонально доминирующей матрицы - PullRequest
1 голос
/ 10 января 2012

Есть ли способ сгенерировать случайное n по n строго по диагонали в Mathematica?Я использую следующий код для генерации случайной квадратной матрицы:

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

РЕДАКТИРОВАТЬ: Мне просто нужен способ для генерации большой строго по диагонали доминирующей матрицы, случайность строк не имеет решающего значения.

Ответы [ 2 ]

7 голосов
/ 10 января 2012

Вы можете суммировать абсолютные значения каждой строки и добавлять к этой диагональной записи знак соответствующей диагональной записи, умноженной на ее сумму строки.

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 голос
/ 10 января 2012

как насчет:

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

Мне действительно начинает нравиться этот способ функционального программирования.Похоже, что это также делает код короче, и я думаю, что это хорошо.Чем меньше кода, тем меньше вероятность ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...