迭代矩阵R

时间:2015-11-10 23:46:15

标签: r for-loop matrix iterator

我有“cbind”ed 2矩阵来制作矩阵“x”,使得每一行的第一列在一起,而对于第二列对则是相同的:

X1   Y1   X2   Y2    etc.   
val  val  val  val
val  val  val  val
val  val  val  val

在实际创建的矩阵中,列数比上面的示例多得多。 我试图用:

迭代矩阵
    for (i in 1:49){
       slope = atan((x[i+1,2]-x[i, 2])/(x[i+1,1]-x[i,1]))
    }

因此,您可以看到我正在尝试从前两列下降的连续值中获取斜率。我的问题是我不知道如何使这个函数迭代整个矩阵并对每个列对执行相同的操作。 有什么提示吗?

2 个答案:

答案 0 :(得分:1)

第一步是按列找出每个元素之间的差异。然后我们应用斜率函数。 (为了比较结果,使用了@ latemail的示例矩阵)。

diffs <- apply(x, 2, function(x) x[-1]-x[-length(x)])
atan(diffs[,c(F,T)]/diffs[,c(T,F)])
#             Y1       Y2
# [1,] 0.7853982 1.249046
# [2,] 1.1071487 1.325818
# [3,] 1.3258177 1.446441
# [4,] 1.4464413 1.508378

单线解决方案如何在两个答案之间进行混合:)

atan(diff(x)[,c(F,T)]/diff(x)[,c(T,F)])

数据

x <- cbind(X1=1:5,Y1=c(1,2,4,8,16),X2=1:5,Y2=c(1,4,8,16,32))

答案 1 :(得分:0)

避免循环并使用一些函数式编程,如diffpaste

x <- cbind(X1=1:5,Y1=c(1,2,4,8,16),X2=1:5,Y2=c(1,4,8,16,32))
x

#     X1 Y1 X2 Y2
#[1,]  1  1  1  1
#[2,]  2  2  2  4
#[3,]  3  4  3  8
#[4,]  4  8  4 16
#[5,]  5 16  5 32

dfx <- diff(x)
atan(dfx[,paste0("X",1:2)]) / dfx[,paste0("Y",1:2)]

#            X1       X2
#[1,] 0.7853982 1.249046
#[2,] 1.1071487 1.325818
#[3,] 1.3258177 1.446441
#[4,] 1.4464413 1.508378