Арифметическая операция (разность) между вектором и матрицей в 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. матрица превращается в последовательность чисел (вектор)
  2. Ваш "список1" расширяется (повторяется), так что его длина соответствует длине вектора, построенного из матрицы.
  3. элементы в каждом вычитаются друг из друга
  4. числа снова собраны в матричной форме.

В твоем случае:

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
Другие вопросы по тегам