说我有一个矩阵:
A <- matrix(c(2,4,3,1,5,7), nrow=3, ncol=2)
colnames(A) <- c ("x", "y")
A
x y
[1,] 2 1
[2,] 4 5
[3,] 3 7
有没有办法使用for循环访问矩阵的每一行?
我要做的是将每个连续点(x,y)之间的欧氏距离相加。所以在这个例子中,我会找到:
之间的总距离(2,1)和(4,5)
(4,5)和(3,7)
首先,我会找到两点之间的距离,即:
(2,1) and (4,5) => (|4-2|,|5-1|) => (2,4)
(4,5) and (3,7) => (|3-4|,|7-5|) => (1,2)
然后我会把它变成欧几里德距离:
(2,4) => sqrt(2^2 + 4^2) => 4.47
(1,2) => sqrt(1^2 + 2^2) => 2.24
总距离
4.47 + 2.24 = 6.71
我非常有信心,如果我可以作为向量访问矩阵的每一行,我可以很容易地编码。但是,我很想听到更好的方法。
我还在考虑将矩阵转换为列表列表(即(x,y)点列表,其中每个点是x和y值的列表),或点列表(x, Y)。
我在编程方面不是很有经验,而且我刚刚开始使用R,对不起,如果我没有意义的话。
答案 0 :(得分:1)
您可以尝试以下
for (i in 1:nrow(A))
{
row = A[i,]
% Do something with the row
}
答案 1 :(得分:1)
但是,我很想听到更好的方法。
R内置了用于距离计算的函数,例如dist
,例如:
out <- as.matrix(dist(A))
# 1 2 3
#1 0.000000 4.472136 6.082763
#2 4.472136 0.000000 2.236068
#3 6.082763 2.236068 0.000000
您可以使用以下方法提取非对角线,即所需的值:
row(out) - col(out)==1
# [,1] [,2] [,3]
#[1,] FALSE FALSE FALSE
#[2,] TRUE FALSE FALSE
#[3,] FALSE TRUE FALSE
因此:
out[row(out) - col(out)==1]
#[1] 4.472136 2.236068
sum(out[row(out) - col(out)==1])
#[1] 6.708204