Ваш код по-прежнему неверен, поскольку выходные данные должны иметь длину nrow(mat1) * nrow(mat2)
, равную 9
, и не могут вписаться в матрицу 2x2 (которую вы ранее определили). Кроме того, i
должен проходить через mat1
и j
через mat2
; у вас все наоборот. Изменив dista[i,j] <-
на print()
, вы получите:
dista<-matrix(0,ncol=2,nrow=2)
for (i in 1:nrow(mat1)){
for(j in 1:nrow(mat2)){
print(sqrt((mat1[i,1]-mat2[j,1]) + (mat1[i,2]-mat2[j,2])))
}
}
[1] 105.8159
[1] 129.5261
[1] 63.52165
[1] 103.257
[1] 127.4441
[1] 59.1608
[1] 105.8253
[1] 129.5338
[1] 63.53739
Вы можете использовать outer
, чтобы ограничить вычисления только одной векторизованной функцией
y = outer(1:nrow(mat1),1:nrow(mat2),paste)
y
[,1] [,2] [,3]
[1,] "1 1" "1 2" "1 3"
[2,] "2 1" "2 2" "2 3"
[3,] "3 1" "3 2" "3 3"
sapply(as.vector(y), function(x){
aux = as.numeric(strsplit(x," ")[[1]])
sqrt((mat1[aux[1],1]-mat2[aux[2],1]) + (mat1[aux[1],2]-mat2[aux[2],2]))})
1 1 2 1 3 1 1 2 2 2 3 2 1 3 2 3 3 3
105.81588 129.52606 63.52165 103.25696 127.44411 59.16080 105.82533 129.53378 63.53739
Здесь мы сначала создаем матрицу y
, которая содержит все комбинации i
и j
, передает ее в sapply
, а затем разделяет ее, чтобы получить i
и j
по отдельности.