В MATLAB имеют большую матрицу с вероятностями перехода transition_probs
и матрицу смежности adj_mat
. Я хочу, чтобы вычислить кумулятивную сумму переходной матрицы по столбцам, а затем поэлементно умножить его на матрицу смежности, которая действует в качестве маски таким образом:Для больших разреженных матриц в MATLAB вычислите суммарную сумму по столбцам для ненулевых записей?
cumsumTransitionMat = cumsum(transition_probs,2) .* adj_mat;
я получаю ошибку памяти, потому что с cumsum
все элементы матрицы тогда отличны от нуля.
Я хотел бы избежать этой проблемы, только имея совокупные записи сумм, в которых вначале есть ненулевые записи. Как это можно сделать без использования цикла for
?
так что это невозможно? вы знаете, что я пытаюсь сделать? Я хочу сделать марковскую матрицу перехода. Таким образом, в строке (состоянии) имеется только определенный набор ненулевых записей, т. Е. Возможные переходы состояний, обозначаемые матрицей смежности 1/0. У меня есть набор вероятностей для этих состояний. Я бросаю случайное число для следующего состояния кандидата и хочу видеть, какие значения столбцов столбца находятся между ними в суммарной сумме. Как еще я могу это сделать? – Vass
ну, похоже, я выполняю операцию подряд за строкой, вычисляя ее каждый раз, когда происходит переход – Vass
да, я думаю, я понял, что должен делать код (в основном вы хотите выбрать следующее состояние в соответствии с вектором весов, соответствующим вероятности перехода текущего состояния, но ограничиваются только соседними состояниями). Вы как бы реализуете ['randsample'] (http://stackoverflow.com/q/2977497/97160). Проблема в том, что когда результат вычисляется по всей матрице за один раз, он слишком плотный, чтобы соответствовать памяти. Вот почему я предложил зацикливать строки по одному вместо векторизованного вызова. Извините, я не мог больше помочь :) – Amro