Как создать случайную матрицу так, чтобы все строки суммировали до 1 - PullRequest
6 голосов
/ 16 февраля 2012

Вот как будет выглядеть матрица:

Есть 8 столбцов и, скажем, 100 строк, случайные числа в любой строке суммируются с 1.

.125 .125 .125 .125 ........ 125

.005 .105 .005 .205 ........ 205

.002 .003 .012. 201 ....... .200

...

Может ли Matlab автоматически создать такую ​​матрицу, то есть правильную стохастическую матрицу ? Я ищу сценарий.

Ответы [ 5 ]

10 голосов
/ 16 февраля 2012

Используйте bsxfun вместо repmat:

mat = rand(100, 8);
rowsum = sum(mat,2);
mat = bsxfun(@rdivide, mat, rowsum);
6 голосов
/ 16 февраля 2012

Вот еще одна идея: для каждой строки вы можете сгенерировать 7 случайных чисел (от 0 до 1) и рассматривать их как свои «интервальные» местоположения - другими словами, в ваших 8 случайных числах, которые составляют 1, это ваши частичныесуммы.Затем вы можете отсортировать их и взять различия, чтобы получить результирующие случайные числа.Вот код для того, что я думаю:

numrows = 100;
partialsums = [zeros(numrows,1), rand(numrows,7), ones(numrows,1)];
partialsums = sort(partialsums, 2);
randmat = diff(partialsums, 1, 2);

Распределение чисел будет отличаться в зависимости от того, как вы это делаете.Я сравнил этот метод с тем, который опубликовал Aabaz, и получил его для дистрибутивов.

enter image description here

Так что мой метод выглядит немного более экспоненциальным, вы получаете более высокие значения, и егонемного более равномерно, но с меньшим срезом случайных чисел, которые вы получаете.

4 голосов
/ 16 февраля 2012

Вы можете сначала создать свою случайную матрицу, а затем нормализовать ее, чтобы каждая строка имела сумму, равную 1 (если это то, что вы имели в виду):

mat=rand(100,8);
matnorm=repmat(sum(mat,2),1,8);
mat=mat./matnorm;
1 голос
/ 17 июня 2013

шаг 1: Рассчитайте норму вектора, которая является корнем квадратным из суммы квадратов элементов в этом векторе.

шаг 2: Разделите каждый элемент вектора на норму вектора.

шаг 3: Умножьте полученный вектор на его транспонирование, чтобы возвести в квадрат каждый элемент в векторе.

После этого вы можете увидеть, что сумма (конечных) результирующих элементов в векторе составляет 1.

0 голосов
/ 16 февраля 2012

Ну

rand(100,8)

сгенерирует матрицу случайных чисел со 100 строками и 8 столбцами, все записи которых можно добавить в 1. Если это не сработает, то вы получитечтобы объяснить себя немного больше.

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