2017-12-30 28 views
-1

행렬의 두 원소를 모두 추출하여 그 결과를 행렬로 반환하여 계산식에서 수식으로 답을 줄 수있는 방법 :유클리드 거리를 계산하기 위해 r의 행렬에있는 두 원소를 차례로 추출합니다.

[,1][,2][,3][,4][,5][,6] 
[1,] 2 1 5 5 10 1 

난 등 열에 1 개의 첫 번째 반복에서, 3, 4 번째 반복과 압축을 :

예를 들어, I는 6 열이 하나의 행의 행렬을 갖는다. 그 결과는 매트릭스 형태 여야합니다.

[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] 

나의 관심사입니다, 데이터 센터 거리를 계산하는 방법 데이터 행렬의 ns는 2이고, 중심 행렬은 6이다. (데이터 행렬과 중심 행렬의 두 열마다 거리를 계산). 중심 행렬의 각 행에는 3 개의 중심이 있습니다.

+0

"도움이 필요합니다."는 질문이 아닙니다. 귀하의 문제가 신비한 예외인지 또는 언어의 단어 (또는 그 중간에있는 단어)를 알지 못하기 때문에 알 수 없기 때문입니다. * 당신이 필요로하는 것이 무엇인지 정확하게 지정하기 위해 질문을 편집하십시오. –

+0

행렬의 경우'matrix (mat, ncol = 2, byrow = TRUE)'입니다. 'split (mat, rep (seq (length (mat)/2), each = 2))' – alistaire

답변

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)] 
    }) 
}) 

편집 :

I 네가 뭘 정확히하고 있는지 모르겠다.

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 

경우에는, 그러나, 당신은 내가 당신이 동안해야 할 어떤 계산을 할 아마도 가장 쉬운 생각 매트릭스 - 당신의 결과를 얻으려면 : 난 당신이 2 × 3 행렬로 변환 각 행을 원하는 경우, 생각 각 행에 대해 다음과 같이 처리하고 있습니다.

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 

그렇다면 내가하려는 것을 이해하지 못해 이것이 누락 될 수 있습니다. 예제 입력과 실제 예상 출력을 표시하는 새로운 질문을하면 예상 한 실제 값과 함께 더 많은 행운을 누릴 수 있습니다.

+0

을 매트릭스 형태로 얻을 수 있습니까? – DataMiningStudent

+0

@DataMiningStudent - 물론, Trebek-하지만 더 구체적으로 할 수 있습니까? 원래 행렬의 각 행에 대해 별도의 행렬을 사용 했습니까? 아니면 하나의 행렬을 사용하고 있습니까? (위의 경우 alistaire의 대답을 시도 했습니까?) –

+0

안녕하세요, 원래 행렬의 각 행에 대해 별도의 행렬을 원합니다. 예를 들어, 하나의 반복 후에 나는 계산에 사용할 수 있도록 하나의 행렬을 얻었다. 그런 다음 다음 반복은 또 다른 행렬을 계산하고 계산에 대한 답을 제공합니다. 나는 내 자신을 분명히했으면 좋겠어.미안하지만 내 설명이 혼란 스럽다. – DataMiningStudent