Арифметическая операция (разность) между вектором и матрицей в R - PullRequest
0 голосов
/ 26 августа 2018

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

matrix <- matrix(1:10,1:10,nrow = 10,ncol=10)

list1 <- seq(1:10)

diff <- list1-matrix

Ниже приведен вывод, который я пытаюсь достичь, ноэто не работает.Пожалуйста, дайте мне знать, что я делаю неправильно.

Screenshot

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Мы можем сделать это несколькими способами

1 ) Транспонировать матрицу, вычесть из vector, а затем сделать transpose

t(t(matrix)- list1)

2 ) повторить vector, чтобы сделать длины одинаковыми, а затем сделать разницу

matrix - list1[col(matrix)]

3 ) Используя sweep

sweep(matrix, 2, list1, `-`)
0 голосов
/ 26 августа 2018

Что вам нужно понять, так это то, что матрицы 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
...