【问题标题】:extract every two elements in matrix row in r in sequence to calculate euclidean distance依次提取r中矩阵行中的每两个元素以计算欧几里得距离
【发布时间】:2018-06-10 08:42:16
【问题描述】:

如何按顺序提取矩阵中的每两个元素并将结果作为矩阵返回,以便我可以将答案输入公式中进行计算:

例如,我有一个 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,如何计算数据中心距离。 (计算与数据矩阵和中心矩阵每两列的距离)。中心矩阵的每一行都有三个中心。

【问题讨论】:

  • “我需要帮助”不是问题,因为我无法判断您的问题是神秘异常还是不知道该语言的单词(或介于两者之间)。请edit您的问题准确地说明您需要什么帮助。
  • 对于矩阵,matrix(mat, ncol = 2, byrow = TRUE)。如需列表,请split(mat, rep(seq(length(mat) / 2), each = 2))

标签: r genetic-algorithm euclidean-distance


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

也就是说,我不明白你要做什么,所以这可能会错过标记。如果您提出一个新问题,其中显示示例输入和您所追求的实际预期输出以及您期望的实际值,您可能会更幸运。

【讨论】:

  • 能否以矩阵的形式得到答案?
  • @DataMiningStudent - 当然,Trebek- 但你能更具体一点吗?您是在为原始矩阵中的每一行使用单独的矩阵,还是只使用一个矩阵(如果是后者,是否尝试了上面 alistaire 的评论答案)?
  • 嗨,我想为原始矩阵中的每一行创建一个单独的矩阵。例如,经过一次迭代,我得到了一个矩阵,以便我可以在计算中使用它。然后下一次迭代另一个矩阵并提供计算答案。我希望我把自己说清楚了。对不起,如果我的解释令人困惑。
  • 我已编辑我的问题以插入代码草案供您参考
  • @DataMiningStudent - 我做了一些更改,但我仍然不确定你想要做什么 - 希望它会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2020-06-16
  • 2016-08-02
  • 2017-09-23
  • 1970-01-01
  • 2018-06-14
  • 2021-09-15
  • 2021-01-31
  • 1970-01-01
相关资源
最近更新 更多