无非是拿 sub2ind 多捣鼓几下,N比较大时会比for循环快
clear; clc; close all;
N = 200;
size_a = [ 20, 20, 5 ];
a = reshape( [ 1 : 1 : prod( size_a ) ], size_a ); % a = rand(10, 10, 5);
index = randi( [ 1, size_a( 1 ) ], [ N, 2 ] ); %[1,2; 2,4; 5,7];
result = zeros( N, size_a( 3 ) );
tic;
for k = 1 : 1 : N % size( index, 1 )
result( k, : ) = a( index( k, 1 ), index( k, 2 ), : );
end
toc;
tic;
ind = sub2ind( size_a, ...
repmat( index( :, 1 ), [ size_a( 3 ), 1 ] ), ...
repmat( index( :, 2 ), [ size_a( 3 ), 1 ] ), ...
kron( [ 1 : 1 : size_a( 3 ) ].', ones( N, 1 ) ) );
Result = reshape( a( ind ), [ N, size_a( 3 ) ] );
toc;
disp( max( abs( result - Result ), [], 'all' ) )