В этом случае вы можете использовать sub2ind
.
Из документа:
sub2ind (matrixSize, rowSub, colSub) возвращает эквиваленты линейного индекса в строке и столбцеиндексы rowSub и colSub для матрицы размера matrixSize.
Давайте рассмотрим пример:
n = 3300;
m = 5000;
A = randi(m,n,4); %randi(x1,y1,z1)
f = randi(10,m,n);%randi(x2,y2,z2) where y2 >= x1 and z2 >= y1;
%For loop version
tic
B = zeros(size(A));
for ii = 1:size(A,1)
B1(ii,:) = f(A(ii,:),ii);
end
toc
%Linear indexing version
tic
[s1,s2] = size(A);
sub = [1:s1].'+zeros(1,s2); %you can also use sub = repmat(1:s1,s2,1).'
s2i = sub2ind(size(f),A,sub); %create the index according to the subscripts
B2 = f(s2i);
toc
result:
%for loop
%Elapsed time is 0.102647 seconds.
%sub2ind
%Elapsed time is 0.00155091 seconds.
Для создания sub
Я использую функцию неявного расширения, которая требует matlab 2016b или более поздней версии.