R эквивалентно ind2sub / sub2ind в Matlab - PullRequest
13 голосов
/ 15 декабря 2010

Matlab имеет две полезные функции для преобразования матричных индексов в линейные индексы и наоборот. (ind2sub и sub2ind)

Есть ли эквивалентный способ в R?

Ответы [ 6 ]

17 голосов
/ 15 декабря 2010

Это не то, что я использовал раньше, но согласно этому удобному шпаргалке Matlab to R , вы можете попробовать что-то вроде этого, где m - количество строк в матрице., r и c - номера строк и столбцов соответственно, а ind - линейный индекс:

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
8 голосов
/ 22 октября 2011

Для массивов более высокой размерности есть функция arrayInd.

> abc <- array(dim=c(10,5,5))
> arrayInd(12,dim(abc))
     dim1 dim2 dim3
[1,]    2    2    1
4 голосов
/ 12 января 2013

Вам больше не нужны эти функции в R. В Matlab они нужны, потому что вы не можете сделать, например,

A (i, j) = x

, где i, j, x - три вектора индексов строк и столбцов, а x содержит соответствующие значения.(см. также этот вопрос )

В R вы можете просто:

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

4 голосов
/ 16 декабря 2010

Существуют функции row и col, которые возвращают эти индексы в матричной форме.Так что это должно быть так же просто, как индексировать возврат из этих двух функций:

 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
2 голосов
/ 25 января 2018

Поздний ответ, но в базовом пакете есть актуальная функция для ind2sub, называемая 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)

Для sub2ind ответ JD Long кажется лучшим

1 голос
/ 20 января 2014

Примерно так работает для произвольных размеров-

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...