- , MATLAB. , . , 3D- A, 3D-. offset2D offset3D . , , m n.
, m n, 1D , m_arr n_arr, bsxfun -
%
m_arr = round(rand(30,1)*32)+1;
n_arr = round(rand(30,1)*32)+1;
%
mn_arr = (n_arr-1)*size(A,1) + m_arr;
%
offset2D = bsxfun(@plus,[0:27]',[0:27]*size(A,1)); %//'
offset3D = bsxfun(@plus,offset2D(:),[0:30-1]*numel(A(:,:,1)));
%
lidx = bsxfun(@plus,mn_arr(:).',offset3D); %//'
%
A = zeros(60,60,30);
A(lidx) = a;
-
%// Parameters
M = 4;
D = 3;
mx = 3;
%// For-loop code
A = zeros(M+mx,M+mx,D);
a = rand(M,M,D);
m_arr = round(rand(D,1)*mx)+1;
n_arr = round(rand(D,1)*mx)+1;
for i=1:D
m = m_arr(i);
n = n_arr(i);
A(m:m+M-1,n:n+M-1,i) = a(:,:,i);
end
%// Vectorized code
mn_arr = (n_arr-1)*size(A,1) + m_arr;
offset2D = bsxfun(@plus,[0:M-1]',[0:M-1]*size(A,1)); %//'
offset3D = bsxfun(@plus,offset2D(:),[0:D-1]*numel(A(:,:,1)));
lidx = bsxfun(@plus,mn_arr(:).',offset3D); %//'
A_vectorized = zeros(M+mx,M+mx,D);
A_vectorized(lidx) = a;
, -
>> max(abs(A(:)-A_vectorized(:)))
ans =
0