【问题标题】:How to use a for loop on a matrix如何在矩阵上使用 for 循环
【发布时间】:2015-05-13 04:04:11
【问题描述】:

假设我有一个矩阵:

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,如果我说的不明白,请见谅。

【问题讨论】:

  • 很好地制作了一个可重复的示例,清楚地列出了问题、您需要的结果以及您已经考虑过的内容。不过,作为未来的策略,您通常可以通过 google R term 获得有关 R 函数的一些线索以执行特定任务。例如。 R distance 会直接引导你到 dist 函数。

标签: r for-loop matrix


【解决方案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

【讨论】:

    【解决方案2】:

    你可以试试下面的

    for (i in 1:nrow(A))
    {
        row = A[i,]
        % Do something with the row
    }
    

    【讨论】:

    • 谢谢,我没有意识到这有多简单。这在我将 row = A[,i] 更改为 row = A[i,] 时有效,但我将使用 thelatemail 建议的 dist 函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    相关资源
    最近更新 更多