Арифметическая операция (разность) между вектором и матрицей в R
Я сталкиваюсь с этой проблемой, когда пытаюсь вычислить разницу между списком и матрицей в R, она дает мне странные результаты.
matrix <- matrix(1:10,1:10,nrow = 10,ncol=10)
list1 <- seq(1:10)
diff <- list1-matrix
Ниже приведен вывод, который я пытаюсь достичь, но он не работает. Пожалуйста, дайте мне знать, что я делаю неправильно.
2 ответа
Мы можем сделать это несколькими способами
1) Транспонировать матрицу, вычитать из vector
а затем сделать transpose
t(t(matrix)- list1)
2) повторить vector
чтобы сделать длины одинаковыми, а затем сделать разницу
matrix - list1[col(matrix)]
3) Использование sweep
sweep(matrix, 2, list1, `-`)
Что вам нужно понять, так это то, что матрицы R хранятся в порядке столбцов. Это означает, что матрица представляет собой последовательность чисел, упорядоченных по столбцам сверху вниз.
Поэтому, когда вы вычитаете вектор из матрицы, вы можете представить его как операцию с 4 шагами:
- матрица превращается в последовательность чисел (вектор)
- Ваш "список1" расширяется (повторяется), так что его длина соответствует длине вектора, построенного из матрицы.
- элементы в каждом вычитаются друг из друга
- числа снова собраны в матричной форме.
В твоем случае:
1) матрица превращается в последовательность чисел (по столбцам), дающую вам:
1, 1, 1 ,1 ... 1, 2, 2, 2, 2, ... 2, ... ... 10, 10, 10, 10, ... 10
2) Ваш второй вектор повторяется, пока не совпадет с первым:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1 ,2 ,3 ,4 ,5 ,6 ,7 ,8, 9, 10, ... 1, 2, 3, ... 10
3) Теперь они оба имеют одинаковую длину, поэтому они вычитаются друг из друга:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, ..., -9, -8, -7, ... 0
4) Результат снова преобразуется в матрицу, давая вам матрицу, которую вы видите.
Для того, чтобы получить желаемый результат, вы должны принять это во внимание. Один из способов состоит в том, чтобы транспонировать вашу матрицу, выполнить вычитание и снова транспонировать ее:
t(t(matrix) - list1)
Это работает, потому что после транспонирования t
строки превращаются в столбцы.
Другой подход заключается в создании матрицы из вашего вектора list1:
matrix2 <- matrix(list1, nrow=10, ncol=10, byrow=TRUE)
А затем выполните вычитание:
diff <- matrix - matrix2