Подтвердить что ты не робот

R, эквивалентный ind2sub/sub2ind в matlab

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

Существует ли эквивалентный путь в R?

4b9b3361

Ответ 1

Это не то, что я использовал раньше, но, согласно этот удобный денди Matlab для R cheat sheet, вы можете попробовать что-то вроде это, где 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

Ответ 2

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

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

Ответ 3

Существуют функции 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

Ответ 4

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

A (i, j) = x

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

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

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

Ответ 5

Поздний ответ, но есть фактическая функция для 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 ответ кажется лучшим

Ответ 6

Что-то вроде этого работает для произвольных размеров -

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