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?
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?
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 r
c
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
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
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
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
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);
}
Ú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
La pregunta como ésta sugiere que se va a hacer algo simple de una manera compleja ... – mbq