Matlab имеет две полезные функции для преобразования матричных индексов в линейные индексы и наоборот. (ind2sub и sub2ind)
Существует ли эквивалентный путь в R?
Matlab имеет две полезные функции для преобразования матричных индексов в линейные индексы и наоборот. (ind2sub и sub2ind)
Существует ли эквивалентный путь в R?
Это не то, что я использовал раньше, но, согласно этот удобный денди 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
Для массивов с более высокой размерностью существует функция arrayInd
.
> abc <- array(dim=c(10,5,5))
> arrayInd(12,dim(abc))
dim1 dim2 dim3
[1,] 2 2 1
Существуют функции 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
В основном вам не нужны эти функции в R. В Matlab вам нужны те, потому что вы не можете делать, например.
A (i, j) = x
где i, j, x - три вектора индексов строк и столбцов, а x содержит соответствующие значения. (см. также этот вопрос)
В R вы можете просто:
A [cbind (i, j)] < -x
Поздний ответ, но есть фактическая функция для 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 ответ кажется лучшим
Что-то вроде этого работает для произвольных размеров -
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);
}