Составьте матрицу, вычитая каждый элемент вектора из другого его элемента

#r #dataframe #matrix #vector

Вопрос:

Рассмотрим вектор a lt;- c(17.4, 17.2, 17.0, 16.9, 17.0, 17.4)

Как построить следующую матрицу:

 A lt;- 17.4-17.4 17.2-17.4 17.0-17.4 16.9-17.4 17.0-17.4 17.4-17.4  17.4-17.2 17.2-17.2 17.4-17.2 16.9-17.2 17.0-17.2 17.4-17.2  17.4-17.0 17.2-17.0 17.0-17.0 16.9-17.0 17.0-17.0 17.4-17.0  17.4-16.9 17.2-16.9 17.0-16.9 16.9-16.9 17.0-16.9 17.4-16.9  17.4-17.0 17.2-17.0 17.0-17.0 16.9-17.0 17.0-17.0 17.4-17.0  17.4-17.4 17.2-17.4 17.0-17.4 16.9-17.4 17.0-17.4 17.4-17.4  

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

Конечный результат должен быть:

 A lt;- 0.0 -0.2 -0.4 -0.5 -0.4 0.0  0.2 0.0 -0.2 -0.3 -0.2 0.2  0.4 0.2 0.0 -0.1 0.0 0.4  0.5 0.3 0.1 0.0 0.1 0.5  0.4 0.2 0.0 -0.1 0.0 0.4  0.0 -0.2 -0.4 -0.5 -0.4 0.0  

Ответ №1:

Использование внешних

 a lt;- c(17.4, 17.2, 17.0, 16.9, 17.0, 17.4) t(outer(a,a,`-`))   [,1] [,2] [,3] [,4] [,5] [,6] [1,] 0.0 -0.2 -0.4 -0.5 -0.4 0.0 [2,] 0.2 0.0 -0.2 -0.3 -0.2 0.2 [3,] 0.4 0.2 0.0 -0.1 0.0 0.4 [4,] 0.5 0.3 0.1 0.0 0.1 0.5 [5,] 0.4 0.2 0.0 -0.1 0.0 0.4 [6,] 0.0 -0.2 -0.4 -0.5 -0.4 0.0  

Комментарии:

1. Также outer(a, a, FUN=(x,y) y-x) для разнообразия.

Ответ №2:

Вот несколько вариантов,

 sapply(a, function(i) i-a)  matrix(Reduce(`-`, expand.grid(a,a)), ncol = length(a))