在MATLAB中从数组中选择元素

sas*_*740 4 arrays indexing matlab

我知道在MATLAB中,在1D情况下,您可以选择带索引的元素,例如a([1 5 3]),返回a的第1,第5和第3个元素.我有一个2D数组,并希望根据我拥有的一组元组选择单个元素.所以我可能想要a(1,3), a(1,4), a(2,5)等等.目前我拥有的最好diag(a(tuples(:,1), tuples(:,2)),但是对于较大的a和/或元组,这需要大量的内存.我是否必须将这些元组转换为线性索引,或者是否有更简洁的方法来实现我想要的东西而不需要占用太多内存?

Bri*_*n L 6

转换为线性指数似乎是一种合法的方式:

indices = tuples(:, 1) + size(a,1)*(tuples(:,2)-1);
selection = a(indices);
Run Code Online (Sandbox Code Playgroud)

请注意,这也是在Matlab内置解决方案中实现的sub2ind,如nate'2答案:

a(sub2ind(size(a), tuples(:,1),tuples(:,2)))
Run Code Online (Sandbox Code Playgroud)

然而,

a = rand(50);
tuples = [1,1; 1,4; 2,5];

start = tic;
for ii = 1:1e4
    indices = tuples(:,1) + size(a,1)*(tuples(:,2)-1); end
time1 = toc(start);


start = tic;
for ii = 1:1e4
    sub2ind(size(a),tuples(:,1),tuples(:,2)); end
time2 = toc(start);

round(time2/time1)
Run Code Online (Sandbox Code Playgroud)

这使

ans =   
    38
Run Code Online (Sandbox Code Playgroud)

所以虽然sub2ind眼睛更容易,但也慢了约40倍.如果您经常需要执行此操作,请选择上述方法.否则,用于sub2ind提高可读性.