我需要类似B(i,j) = f( A(i,j), i)
的东西,其中A(i,j)
是整数数组,f(a,i)
是指定第{{1}行中a
元素的数组i
数组的}应该被转换。
在Matlab中执行此操作的有效方法是什么?我知道可以通过遍历A
来做到这一点,但是我想使代码高效,因为此步骤可能重复数百万次。
编辑-这是循环版本:
i
答案 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或更高版本所需要的隐式扩展功能。