Изо всех сил пытаясь понять результат "Outer", примененного к двум массивам через вычитание, используемое как векторизованное FUN - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь не понять external в R. Вот мой тестовый пример:

myarray <- array(data = c(0,5,7,3), dim = c(2,2))
myarray
outer_op <- outer(myarray, myarray, "-")
outer_op

На основании того, что я понял (или я бы сказал, неправильно понял) ) до сих пор каждый элемент в массиве будет связан через FUN, векторизованную функцию, которая в моем тестовом случае является оператором вычитания, со всеми другими элементами в массиве, поэтому каждый раз пара значений. Итак, вот что я бы ожидал, что R напечатает, если бы мне пришлось выполнять внешнюю операцию вручную на листе бумаги:

, , 1, 1

     [,1] [,2]
[1,]    0   -7
[2,]   -5   -3

, , 2, 1

     [,1] [,2]
[1,]   -5    2
[2,]    0   -2

, , 1, 2

     [,1] [,2]
[1,]   -7    0
[2,]   -2   -4

, , 2, 2

     [,1] [,2]
[1,]   -3    4
[2,]    2    0

Что я сделал, так это то, что я взял каждый элемент в position (i, j) = (строка, столбец), и я каждый раз вычитал из одного из других элементов в матрице. Так, например, для первой матрицы (,, 1, 1) вот что я сделал:

0 - 0 = 0       = new element at the first row and first column after outer.
0 - 5 = -5      = new element at the second row and first column after outer.
0 - 7 = -7      = new element at the first row and second column after outer.
0 - 3 = -3      = new element at the second row and second column after outer.

Но, похоже, я не понимаю эту концепцию, так как результат, предоставленный R, является полным разные:

, , 1, 1

     [,1] [,2]
[1,]    0    7
[2,]    5    3

, , 2, 1

     [,1] [,2]
[1,]   -5    2
[2,]    0   -2

, , 1, 2

     [,1] [,2]
[1,]   -7    0
[2,]   -2   -4

, , 2, 2

     [,1] [,2]
[1,]   -3    4
[2,]    2    0

Так что я не совсем понимаю, как R сделал вычитание между элементами, чтобы получить эти матрицы. Буду признателен за разъяснения.

1 Ответ

1 голос
/ 20 февраля 2020

Если вы начинаете с myarray и вычитаете myarray[1,1], вы получаете

myarray - myarray[1, 1]
#>      [,1] [,2]
#> [1,]    0    7
#> [2,]    5    3

Затем, если вы берете myarray и вычитаете myarray[2, 1], вы получаете

myarray - myarray[2, 1]
#>      [,1] [,2]
#> [1,]   -5    2
#> [2,]    0   -2

И и так далее.

Таким образом, порядок вычитания просто обратен тому, как вы это делали вручную. Он начинается с myarray и вычитает одно число (взятое из второй копии myarray) из всего первого массива, чтобы получить каждый результирующий фрагмент.

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

zeroarray <- array(data = c(0, 0, 0, 0), dim = c(2, 2))
outer(myarray, zeroarray, "-")
#> , , 1, 1
#> 
#>      [,1] [,2]
#> [1,]    0    7
#> [2,]    5    3
#> 
#> , , 2, 1
#> 
#>      [,1] [,2]
#> [1,]    0    7
#> [2,]    5    3
#> 
#> , , 1, 2
#> 
#>      [,1] [,2]
#> [1,]    0    7
#> [2,]    5    3
#> 
#> , , 2, 2
#> 
#>      [,1] [,2]
#> [1,]    0    7
#> [2,]    5    3

Теперь поменяйте порядок, и каждый элемент myarray будет удален из нулевого массива:

outer(zeroarray, myarray, "-")
#> , , 1, 1
#> 
#>      [,1] [,2]
#> [1,]    0    0
#> [2,]    0    0
#> 
#> , , 2, 1
#> 
#>      [,1] [,2]
#> [1,]   -5   -5
#> [2,]   -5   -5
#> 
#> , , 1, 2
#> 
#>      [,1] [,2]
#> [1,]   -7   -7
#> [2,]   -7   -7
#> 
#> , , 2, 2
#> 
#>      [,1] [,2]
#> [1,]   -3   -3
#> [2,]   -3   -3

Создано в 2020-02-20 пакетом Представления (v0.3.0)

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