2010-12-15 74 views
11

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?

+3

La question comme vous suggère allez faire quelque chose de simple façon complexe ... – mbq

Répondre

14

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 
+0

référence Nice. – Wok

+0

+1 Ce sont les types de fonctions que je réécris en R, juste pour avoir la même fonctionnalité simple. Cette feuille de triche est une bonne référence. – Iterator

4

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 
5

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 
4

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

1

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); 
} 
2

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