首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在矩阵上使用for循环

如何在矩阵上使用for循环
EN

Stack Overflow用户
提问于 2015-05-13 04:04:11
回答 2查看 190关注 0票数 2

假设我有一个矩阵:

代码语言:javascript
复制
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)

首先,我要找出两点之间的距离,即:

代码语言:javascript
复制
(2,1) and (4,5)    =>   (|4-2|,|5-1|)    =>      (2,4)
(4,5) and (3,7)    =>   (|3-4|,|7-5|)    =>      (1,2)

然后我把它转换成欧几里得距离:

代码语言:javascript
复制
(2,4)   =>    sqrt(2^2 + 4^2)    => 4.47
(1,2)   =>    sqrt(1^2 + 2^2)    => 2.24

和总距离

代码语言:javascript
复制
4.47 + 2.24 = 6.71

我很有信心,如果我可以以向量的形式访问矩阵的每一行,我可以很容易地对其进行编码。然而,我希望听到更好的方法来做这件事。

我还考虑将矩阵转换为列表列表(即(x,y)点的列表,其中每个点都是x和y值的列表),或者点的列表(x,y)。

我在编程方面不是很有经验,我刚刚开始使用R,所以如果我说不通的话,很抱歉。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-13 04:14:52

然而,我希望听到更好的方法来做这件事。

R已经为诸如dist这样的距离计算内置了函数,例如:

代码语言:javascript
复制
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

您可以使用以下方法提取非对角线,这是您想要的值:

代码语言:javascript
复制
row(out) - col(out)==1
#      [,1]  [,2]  [,3]
#[1,] FALSE FALSE FALSE
#[2,]  TRUE FALSE FALSE
#[3,] FALSE  TRUE FALSE

因此:

代码语言:javascript
复制
out[row(out) - col(out)==1]
#[1] 4.472136 2.236068
sum(out[row(out) - col(out)==1])
#[1] 6.708204
票数 1
EN

Stack Overflow用户

发布于 2015-05-13 04:08:38

您可以尝试以下方法

代码语言:javascript
复制
for (i in 1:nrow(A))
{
    row = A[i,]
    % Do something with the row
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30205476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档