Цикл для итеративного получения rowums = colsums для i = j - PullRequest
0 голосов
/ 29 мая 2019

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

Моя проблема не столько в коде, сколько в понимании нужной мне логики (что, возможно, является более сложной частью программирования).

Неформальное объяснение моей проблемы состоит в том, что я хочу изменить матрицу A (которая оказывается разреженной) так, чтобы суммы строк равнялись суммам столбцов. Я могу сделать это, добавив к A матрицу AS, где S - матрица весов.

Формально, я хочу найти матрицу S такую, что (A + AS) ONESn = T и (t (A) + T (A) S) ONESn = T, где ONESn - это вектор единиц, который создает T, вектор суммы строк.

Вектор T задуман как камень, это текущие суммы столбцов и цель для сумм строк.

Я думаю, что я хочу решить эту проблему для каждой строки i и столбца j, где i = j. Я хочу найти сумму строки и вычислить, как далеко она находится от цели. Затем я хочу изменить каждый элемент этой строки таким образом, чтобы сумма строк равнялась цели (или была, по крайней мере, «достаточно близка», где я могу установить «достаточно близко»).

Однако это условие зависит от того, что сумма столбца j также должна равняться цели.

Как мне спроектировать логику так, чтобы я мог начать, скажем, со столбца 1 и строки 1, выяснить значения в строке 1, а затем выяснить значения столбца 1, при условии, что первая запись столбца 1 является «фиксированной» по более ранней процедуре.

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

И так до тех пор, пока вы не доберетесь до последнего столбца и строки

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

Я также работал над этим вручную (для матрицы 2x2), я могу найти ответ, но я не уверен, как мне это удалось, поэтому я изо всех сил пытаюсь его кодировать.

Предположим, что A - матрица 2x2 из [1, 2, 3, 4]. Суммы строк равны [4, 6]. Суммы столбцов [3, 7].

1 3  | 4 
2 4  | 6
___
3 7

если добавить матрицу S = [1, 0, -1, 0]

1 -1
0  0

Я получаю A + S = [2, 2, 2, 4], у которого есть суммы строк [4, 6].

2 2  | 4 
2 4  | 6
___
4 6

Ожидаемые результаты представляют собой матрицу (A + AS), в которой суммы строк равны суммам столбцов.

Или сообщение об ошибке "не сходится"

1 Ответ

1 голос
/ 29 мая 2019

У вас есть некоторая матрица A, и вам нужно добавить другую матрицу S, чтобы полученная матрица M имела те же суммы строк, что и суммы столбцов. Это значит:

A + S = M # Для сумм M строк = сумм столбцов

Итак, что вам нужно сделать, это найти S. Вы можете просто изменить уравнение на

S = M - S

Теперь вы можете установить любую матрицу с одинаковой суммой строки и суммы столбца для M и получить S. Получив S, вы можете сделать

A + S = M.

Это означает, что вы можете добавить к каждой матрице A другую матрицу S, чтобы полученная матрица M имела суммы строк = суммы столбцов. Следовательно, вы не получите messege "матрица не сходится".

Вот код R

A <- matrix(rnorm(4), ncol= 2)
M <- matrix(c(2,2,2,4), ncol= 2)
S <- M - A
rowSums(A+S) == colSums(A+S)
TRUE TRUE

Или, более общее:

row_col_num <- 5 # number of columns and rows
A <- matrix(rnorm(row_col_num *row_col_num ), ncol= row_col_num )
M <- matrix(rep(1, row_col_num *row_col_num ), ncol= row_col_num )
S <- M - A
rowSums(A+S) == colSums(A+S)
TRUE TRUE TRUE TRUE TRUE

Полученная матрица A + S всегда такая, как вы установили M. Поэтому я не уверен, для чего это нужно. Если вам нужно знать, как найти S, где A + S дает вам матрицу M с суммами строк = суммами столбцов, это то, как вы можете это сделать.

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