Доступ к значениям с помощью индексов без использования sub2ind

Рассмотрим матрицу M и набор индексов, хранящихся в столбцах I и J. Мне нужно получить доступ к элементам, обозначенным I и J, без преобразования их в линейные индексы (т. е. с помощью sub2ind). Например.

M = [1 2 3;4 5 6;7 8 9];
I = [1 1 1];
J = [1 2 3];

VALS = [1 2 3];

Кроме того, выполнение следующего невозможно, поскольку I и J огромны:

VALS = diag(M(I,J));

И для демонстрации это не то, что я ищу,

VALS = M(sub2ind(size(M),I,J));

По сути, sub2ind, похоже, занимает много времени, и сейчас я ищу методы для доступа к этим элементам без преобразования индексов в индексы. Возможен любой другой способ, если он быстрее, чем метод с использованием sub2ind.


person Jacob    schedule 18.07.2009    source источник


Ответы (1)


Это может быть быстрее, чем использование SUB2IND:

[r,c] = size(M);  % Get the size of M
vals = M(I+r.*(J-1));  % Compute a linear index with vector operations
person gnovice    schedule 18.07.2009
comment
В последних версиях Matlab это может фактически избежать большого выделения памяти, потому что Matlab обычно достаточно умен, чтобы вычислять промежуточные результаты, не создавая больших временных, т. е. он будет выполнять индексацию и присваивание так, как человек сделал бы это в C. - person Mr Fooz; 18.07.2009
comment
На самом деле это то же самое, что делает sub2ind, за исключением проверки границ. Преимущество в скорости достигается главным образом за счет исключения вызовов min и max, которые эти проверки границ выполняют для индексов. В отличие от того, что написал г-н Фуз, в некоторых тестах, которые я выполнил в R2015b с некоторыми огромными I и J, оказалось немного эффективнее сначала вычислить линейный индекс, например ind=I+r.*(J-1), а затем M(ind), вместо вычисления M(I+r.*(J-1)) за один раз. идти. - person Elmar Zander; 29.03.2017