para - poligono en r
Asignar valor a entradas diagonales de matriz (2)
Necesito acceder y asignar ranuras únicas de una matriz m * n dentro de un bucle for. El código hasta el momento:
rowCount <- 9
similMatrix = matrix(nrow = rowCount - 1, ncol = rowCount)
show(similMatrix)
for(i in (rowCount - 1)){
for (j in rowCount)
if (i == j){
similMatrix[i == j] <- 0;
}
}
show(similMatrix)
entonces si i = j, el valor de NA en la matriz necesita ser reemplazado por 0.
Desea la función diag<-
m <- matrix(1:12, nrow=3)
m
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
diag(m) <- 0
m
[,1] [,2] [,3] [,4]
[1,] 0 4 7 10
[2,] 2 0 8 11
[3,] 3 6 0 12
Con el fin de establecer los elementos "diagonales" a cero, ya se te ha dado una respuesta, pero me pregunto si esperabas algo más general. Las razones de la falta de éxito con ese código eran dobles: la construcción de sus índices era defectuosa y la indexación era incorrecta. Esto hubiera tenido éxito:
for(i in 1:(rowCount - 1)){ # need an expression that retruns a sequence
for (j in 1:rowCount) # ditto
if (i == j){
similMatrix[i,j] <- 0; # need to index the matrix with two element if using i,j
}
}
#----------
> show(similMatrix)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 0 NA NA NA NA NA NA NA NA
[2,] NA 0 NA NA NA NA NA NA NA
[3,] NA NA 0 NA NA NA NA NA NA
[4,] NA NA NA 0 NA NA NA NA NA
[5,] NA NA NA NA 0 NA NA NA NA
[6,] NA NA NA NA NA 0 NA NA NA
[7,] NA NA NA NA NA NA 0 NA NA
[8,] NA NA NA NA NA NA NA 0 NA
Pero recurrir a bucles en R generalmente se considera un último recurso (a veces por las razones equivocadas). Hay una forma mucho más compacta de hacer la misma operación de "bucle" y se generaliza más que simplemente establecer la diagonal.
similMatrix[ row(similMatrix) == col(similMatrix) ] <- 0
> similMatrix
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 0 NA NA NA NA NA NA NA NA
[2,] NA 0 NA NA NA NA NA NA NA
[3,] NA NA 0 NA NA NA NA NA NA
[4,] NA NA NA 0 NA NA NA NA NA
[5,] NA NA NA NA 0 NA NA NA NA
[6,] NA NA NA NA NA 0 NA NA NA
[7,] NA NA NA NA NA NA 0 NA NA
[8,] NA NA NA NA NA NA NA 0 NA
Si quisiera establecer la subdiagonal a cero, podría usar:
similMatrix[ row(similMatrix)-1 == col(similMatrix) ] <- 0
Puede evitar generar las matrices de fila y col adicionales usando esto:
mind <- min( dim(similMatrix) )
# avoid going outside dimensions if not symmetric
similMatrix[ cbind( seq(maxd),seq(maxd) ) <- 0