如何在矩阵中按顺序提取每两个元素并将结果作为矩阵返回,以便我可以在公式中提供答案进行计算:
例如,我有一个包含6列的行矩阵:
[,1][,2][,3][,4][,5][,6]
[1,] 2 1 5 5 10 1
我想在第一次迭代中提取第1列和第2列,在第二次迭代中提取3和4,依此类推。结果必须是矩阵形式。
[1,] 2 1
[2,] 5 5
[3,] 10 1
我的原始代码:
data <- matrix(c(1,1,1,2,2,1,2,2,5,5,5,6,10,1,10,2,11,1,11,2), ncol = 2)
中心矩阵:
[,1][,2][,3][,4][,5][,6]
[1,] 2 1 5 5 10 1
[2,] 1 1 2 1 10 1
[3,] 5 5 5 6 11 2
[4,] 2 2 5 5 10 1
[5,] 2 1 5 6 5 5
[6,] 2 2 5 5 11 1
[7,] 2 1 5 5 10 1
[8,] 1 1 5 6 11 1
[9,] 2 1 5 5 10 1
[10,] 5 6 11 1 10 2
objCentroidDist <- function(data, centers) {
resultMatrix <- matrix(NA, nrow=dim(data)[1], ncol=dim(centers)[1])
for(i in 1:nrow(centers)) {
resultMatrix [,i] <- sqrt(rowSums(t(t(data)-centers[i, ])^2))
}
resultMatrix
}
objCentroidDist(data,centers)
我希望结果矩阵如下:
[1,][,2][,3]
[1,]
[2,]
[3,]
[4,]
[5,]
[7,]
[8,]
[9,]
[10]
我关心的是,如果数据矩阵的维数是2,中心矩阵是6,如何计算数据中心距离。 (计算距数据矩阵的距离和中心矩阵中的每两列)。中心矩阵的每一行都有三个中心。
答案 0 :(得分:1)
这样的事可能吗?
m <- matrix(c(2,1,5,5,10,1), ncol = 6)
list.seq.pairs <- lapply(seq(1, ncol(m), 2), function(x) {
m[,c(x, x+1)]
})
> list.seq.pairs
[[1]]
[1] 2 1
[[2]]
[1] 5 5
[[3]]
[1] 10 1
并且,如果您想要迭代矩阵中的多行, 你可以像这样扩展上面的内容:
mm <- matrix(1:18, ncol = 6, byrow = TRUE)
apply(mm, 1, function(x) {
lapply(seq(1, length(x), 2), function(y) {
x[c(y, y+1)]
})
})
修改强>
我真的不确定你到底是怎么回事。我想,如果你想将每一行转换成一个2 x 3矩阵:
mm <- matrix(1:18, ncol = 6, byrow = TRUE)
list.mats <- lapply(1:nrow(mm), function(x){
a = matrix(mm[x,], ncol = 2, byrow = TRUE)
})
> list.mats
[[1]]
[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 5 6
[[2]]
[,1] [,2]
[1,] 7 8
[2,] 9 10
[3,] 11 12
[[3]]
[,1] [,2]
[1,] 13 14
[2,] 15 16
[3,] 17 18
但是,如果您想要获得结果矩阵 - 我认为在您处理每一行时,您可能最容易做任何计算:
results <- t(apply(mm, 1, function(x) {
sapply(seq(1, length(x), 2), function(y) {
val1 = x[y] # Get item one
val2 = x[y+1] # Get item two
val1 / val2 # Do your calculation here
})
}))
> results
[,1] [,2] [,3]
[1,] 0.5000000 0.7500 0.8333333
[2,] 0.8750000 0.9000 0.9166667
[3,] 0.9285714 0.9375 0.9444444
那就是说,我不明白你想要做什么,这可能会错过这个标志。如果你问一个新的问题,你可能会有更多的运气,你可以用你想要的实际值来显示你输入的实例和你想要的实际预期输出。