Matlab a deux fonctions utiles pour convertir des indices matriciels en indices linéaires et vice versa. (ind2sub et sub2ind)L'équivalent de R à ind2sub/sub2ind dans matlab
Existe-t-il un moyen équivalent dans R?
Matlab a deux fonctions utiles pour convertir des indices matriciels en indices linéaires et vice versa. (ind2sub et sub2ind)L'équivalent de R à ind2sub/sub2ind dans matlab
Existe-t-il un moyen équivalent dans R?
Ce n'est pas quelque chose que j'ai utilisé auparavant, mais selon this handy dandy Matlab to R cheat sheet, vous pouvez essayer quelque chose comme ça, où m
est le nombre de lignes dans la matrice, r
et c
sont des numéros de ligne et de colonne respectivement, et ind
la indice linéaire:
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
Il y a des fonctions de ligne et la colonne qui renvoient ces indices sous forme matricielle. Donc, il devrait être aussi simple que l'indexation du retour de ces deux fonctions:
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
Pour les tableaux de dimension supérieure, il y a la fonction arrayInd
.
> abc <- array(dim=c(10,5,5))
> arrayInd(12,dim(abc))
dim1 dim2 dim3
[1,] 2 2 1
Vous n'avez pas besoin la plupart du temps ces fonctions dans R. Dans Matlab vous avez besoin ceux parce que vous ne pouvez pas faire par exemple
A (i, j) = x
où i, j, x sont trois vecteurs d'indices de rangées et de colonnes et X contient les valeurs correspondantes. (Voir aussi this question)
En R, vous pouvez simplement:
A [cbind (i, j)] < - x
Quelque chose comme cela fonctionne pour Dimensions- arbitraire
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);
}
Réponse tardive, mais il y a une fonction réelle pour ind2sub dans le paquet de base appelé 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)
Pour sub2ind, la réponse de JD long semble être le meilleur
La question comme vous suggère allez faire quelque chose de simple façon complexe ... – mbq