假設我有 5 對矢量形式的坐標 (x1,y1)(region1) , (x2,y2)(region2) 等等直到 (x5,y5)(region5)。現在我想找出每個區域彼此之間的距離。例如,我取距離,D = √[(??i?????)^2 (?????????)^2] 在區域 i 和 j 之間,輸出將是一個 5 x 5 的矩陣,其中矩陣中的每個條目 (Dij ) 是兩個區域之間的距離。
例如,我有區域 1,其坐標為 (4,3) 和區域 2 (1,2)。那么這兩個區域之間的距離應該是 D = √10 并且這應該在 Dij 的條目中,其中 i = 1 和 j = 2,因此 D12 如上述矩陣所示。我已經嘗試了如下所示的代碼:
x=c(1,2,4,1,1)
y=c(4,3,1,2,2)
Distance = function(x,y){
D = sqrt(abs((x[i]-x[j])^2 (y[i]-y[j])^2))
A = matrix(0,nrow=5,ncol=5,T)
i = nrow(A)
j = ncol(A)
for (i in 1:5){
for (j in 1:5){
A[i][j] = D
}
}
return(A)
}
輸出:
Warning messages:
1: In A[i] <- `*vtmp*` :
number of items to replace is not a multiple of replacement length
其中有 20 條警告訊息。嘆。我知道我的代碼遠非正確。請幫忙
uj5u.com熱心網友回復:
該代碼存在以下問題。
- 定義 D 的行使用了 i 和 j,即使它們在那個時候還沒有被定義
- 定義 D 的行使用 abs(...) 但 (...) 內的部分從不為負,因此使用 abs 毫無意義
- 如果 x[i], y[i] 是第 i 個點,那么 x 和 y 的長度必須相同,所以我們應該檢查一下。
- 定義 A 硬編碼 5 的行,因此該函式僅在 x 和 y 的長度為 5 時才能作業。
- 矩陣的第四個引數是 T。永遠不要使用 T 來表示 TRUE。總是寫出來,因為 T 是一個可能的變數,但 TRUE 永遠不能是變數名。
- 在定義矩陣時指定 byrow = TRUE 毫無意義,因為每個元素都被賦予相同的值,因此順序無關緊要。事實上,我們根本不需要填充 A,因為回圈稍后會這樣做。
- i 和 j 定義為 nrow(A) 和 ncol(A);然而,緊接著它們被重新定義,因此原始定義被丟棄并且從未使用過。這些行沒有任何作用。
- 這兩個回圈將上限硬編碼為 5,因此,同樣,該函式僅在 x 和 y 的長度均為 5 時才起作用。
- A[i][j] 應該是 A[i, j]
- D 在回圈中使用,但在回圈外定義,因此 A[i,j] 的每個元素都將被賦予相同的值
- 代碼沒有縮進,難以閱讀
- 在代碼中添加更多空格將使其更易于閱讀
- 雖然寫 return(A) 沒有錯,只要寫 A 就足以回傳它
- 問題是指輸出,但沒有輸出,因為代碼從不運行該函式
代碼 -
Distance = function(x, y) {
stopifnot(length(x) == length(y))
n = length(x)
A = matrix(nrow = n, ncol = n)
for (i in 1:n) {
for (j in 1:n) {
A[i, j] = sqrt( (x[i] - x[j])^2 (y[i] - y[j])^2 )
}
}
A
}
# test
x = c(1, 2, 4, 1, 1)
y = c(4, 3, 1, 2, 2)
Distance(x, y)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.0000 1.4142 4.2426 2.0000 2.0000
## [2,] 1.4142 0.0000 2.8284 1.4142 1.4142
## [3,] 4.2426 2.8284 0.0000 3.1623 3.1623
## [4,] 2.0000 1.4142 3.1623 0.0000 0.0000
## [5,] 2.0000 1.4142 3.1623 0.0000 0.0000
請注意,這可以使用外部更緊湊地完成。
d <- function(i, j) sqrt((x[i] - x[j])^2 (y[i] - y[j])^2)
n <- length(x)
outer(1:n, 1:n, Vectorize(d))
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.0000 1.4142 4.2426 2.0000 2.0000
## [2,] 1.4142 0.0000 2.8284 1.4142 1.4142
## [3,] 4.2426 2.8284 0.0000 3.1623 3.1623
## [4,] 2.0000 1.4142 3.1623 0.0000 0.0000
## [5,] 2.0000 1.4142 3.1623 0.0000 0.0000
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/368453.html
上一篇:如何挑出矩陣中的特定值[R]
