2010-12-15 16 views
11

Matlab tiene dos funciones útiles para convertir subíndices de matriz a índices lineales y viceversa. (ind2sub y sub2ind)R's equivalente a ind2sub/sub2ind en matlab

¿Hay una manera equivalente en R?

+3

La pregunta como ésta sugiere que se va a hacer algo simple de una manera compleja ... – mbq

Respuesta

14

esto no es algo que he usado antes, pero de acuerdo con this handy dandy Matlab to R cheat sheet, puede intentar algo como esto, donde m es el número de filas de la matriz, y rc son números de fila y columna, respectivamente, y el ind índice lineal:

MATLAB:

[r,c] = ind2sub(size(A), ind) 

R:

r = ((ind-1) %% m) + 1 
c = floor((ind-1)/m) + 1 

MATLAB:

ind = sub2ind(size(A), r, c) 

R:

ind = (c-1)*m + r 
+0

Niza referencia. – Wok

+0

+1 Estos son los tipos de funciones que reescribo en R, solo para tener la misma funcionalidad simple. Esa hoja de trucos es una buena referencia. – Iterator

4

Hay fila y col funciones que devuelven estos índices en forma de matriz. Por lo que debe ser tan simple como indexar el regreso de esas dos funciones:

M<- matrix(1:6, 2) 
row(M)[5] 
#[1] 1 
col(M)[5] 
#[1] 3 
rc.ind <- function(M, ind) c(row(M)[ind], col(M)[ind]) 
rc.ind(M,5) 
[1] 1 3 
5

Para las matrices de dimensiones más altas, no es la función arrayInd.

> abc <- array(dim=c(10,5,5)) 
> arrayInd(12,dim(abc)) 
    dim1 dim2 dim3 
[1,] 2 2 1 
4

Usted mayoría no necesita esas funciones en R. En Matlab que necesita porque los no se puede hacer, por ejemplo,

A (i, j) = x

donde i, j, x tres vectores de índices de fila y columna y X contiene los valores correspondientes. (Véase también this question)

En R puede simplemente:

A [cbind (i, j)] < - x

1

Algo como esto funciona para arbitraria dimensiones-

ind2sub = function(sz,ind) 
{ 
    ind = as.matrix(ind,ncol=1); 
    sz = c(1,sz); 
    den = 1; 
    sub = c(); 
    for(i in 2:length(sz)){ 
     den = den * sz[i-1]; 
     num = den * sz[i]; 
     s = floor(((ind-1) %% num)/den) + 1; 
     sub = cbind(sub,s); 
    } 
    return(sub); 
} 
2

Última respuesta, pero hay una función real para ind2sub en el paquete base llamado arrayInd

m <- matrix(1:25, nrow = 5, ncol=5) 
# linear indices in R increase row number first, then column 
arrayInd(5, dim(m)) 
arrayInd(6, dim(m)) 
# so, for any arbitrary row/column 
numCol <- 3 
numRow <- 4 
arrayInd(numRow + ((numCol-1) * nrow(m)), dim(m)) 
# find the row/column of the maximum element in m 
arrayInd(which.max(m), dim(m)) 
# actually which has an arr.ind parameter for returning array indexes 
which(m==which.max(m), arr.ind = T) 

Para sub2ind, la respuesta de JD largo parece ser la mejor

Cuestiones relacionadas