【发布时间】:2016-04-16 11:36:19
【问题描述】:
我在 MATLAB 中有一个二维矩阵,我使用两种不同的方式来访问它的元素。一种基于下标索引,另一种基于线性索引。我通过以下代码测试这两种方法:
N = 512; it = 400; im = zeros(N);
%// linear indexing
[ind_x,ind_y] = ndgrid(1:2:N,1:2:N);
index = sub2ind(size(im),ind_x,ind_y);
tic
for i=1:it
im(index) = im(index) + 1;
end
toc %//cost 0.45 seconds on my machine (MATLAB2015b, Thinkpad T410)
%// subscript indexing
x = 1:2:N;
y = 1:2:N;
tic
for i=1:it
im(x,y) = im(x,y) +1;
end
toc %// cost 0.12 seconds on my machine(MATLAB2015b, Thinkpad T410)
%//someone pointed that double or uint32 might an issue, so we turn both into uint32
%//uint32 for linear indexing
index = uint32(index);
tic
for i=1:it
im(index) = im(index) +1;
end
toc%// cost 0.25 seconds on my machine(MATLAB2015b, Thinkpad T410)
%//uint32 for the subscript indexing
x = uint32(1:2:N);
y = uint32(1:2:N);
tic
for i=1:it
im(x,y) = im(x,y) +1;
end
toc%// cost 0.11 seconds on my machine(MATLAB2015b, Thinkpad T410)
%% /*********************comparison with others*****************/
%//third way of indexing, loops
tic
for i=1:it
for j=1:2:N
for k=1:2:N
im(j,k) = im(j,k)+1;
end
end
end
toc%// cost 0.74 seconds on my machine(MATLAB2015b, Thinkpad T410)
看来直接使用下标索引比从sub2ind得到的线性索引要快。有谁知道为什么?我以为它们几乎是一样的。
【问题讨论】:
-
sub2ind有一些开销。试试它的“手动”版本index = bsxfun(@plus, (1:2:size(im,1)).', ((1:2:size(im,2))-1)*size(im,1))。另外,最好使用timeit而不是tic/toc -
哎呀,现在我看到我提到的开销超出了你的时间
-
@Luis,我没有计算 sub2ind 的时间。只有两种访问矩阵中元素的方法。
-
@TroyHaskin 据我了解,在 MATLAB 中,下标索引是语法糖。 MATLAB 在内部将所有高维矩阵存储为线性数组 (mathworks.com/help/matlab/matlab_prog/…)
-
@Dan,是的,我认为 Matlab 具有线性存储。这就是为什么这段代码让我感到困惑。在线性情况下,线性索引应该比下标方式更快。但结果却恰恰相反。