通过另一个数组有效地索引一个数组,而无需使用循环

时间:2018-10-15 13:53:26

标签: arrays matlab

我需要类似B(i,j) = f( A(i,j), i)的东西,其中A(i,j)是整数数组,f(a,i)是指定第{{1}行中a元素的数组i数组的}应该被转换。

在Matlab中执行此操作的有效方法是什么?我知道可以通过遍历A来做到这一点,但是我想使代码高效,因为此步骤可能重复数百万次。

编辑-这是循环版本:

i

1 个答案:

答案 0 :(得分:1)

在这种情况下,您可以使用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

结果:

%for loop
%Elapsed time is 0.102647 seconds.
%sub2ind
%Elapsed time is 0.00155091 seconds.

要创建sub,我使用的是Matlab 2016b或更高版本所需要的隐式扩展功能。