我正在使用Matlab R2014a。
我有一个3维M x N x M矩阵A。我想用向量化的方法从中提取2维矩阵B,这样对于每个i,j
B(i,j)= A(i,j,g(i,j))
其中g是大小为M x N的二维索引矩阵,即在{1,2,...,M}中具有整数值。
上下文是我将函数A(k,z,k')表示为3维矩阵,将函数g(k,z)表示为2维矩阵,并且我想计算该函数
h(k,z)= f(k,z,g(k,z))
这似乎是一件简单而又常见的事情,但我真的在网上找不到任何东西。非常感谢任何可以帮助的人!
我的第一个想法是尝试尝试类似B = A(:,:,g)或B = A(g)的方法,但是毫无疑问,这些方法都不起作用。有类似的东西吗?
您可以在bsxfun
此处采用最佳工具进行矢量化-
B = A(bsxfun(@plus,[1:M]',M*(0:N-1)) + M*N*(g-1))
步骤#1:计算对应于所述第一两个维的索引(行和列)的A
-
bsxfun(@plus,[1:M]',M*(0:N-1))
第2步:添加所需的偏移量,以包含要提供的dim-3索引,g
并使用这些索引将索引添加到A中以获得所需的输出-
A(bsxfun(@plus,[1:M]',M*(0:N-1)) + M*N*(g-1))
这里有一个快速的基准测试,以这种比较bsxfun
基础的方法对ndgrid + sub2ind
中提出了基于解决方案路易斯的解决方案以M
和N
为100
。
使用的基准测试代码tic-toc
如下所示:
M = 100;
N = 100;
A = rand(M,N,M);
g = randi(M,M,N);
num_runs = 5000; %// Number of iterations to run each approach
%// Warm up tic/toc.
for k = 1:50000
tic(); elapsed = toc();
end
disp('-------------------- With BSXFUN')
tic
for iter = 1:num_runs
B1 = A(bsxfun(@plus,[1:M]',M*(0:N-1)) + M*N*(g-1)); %//'
end
toc, clear B1
disp('-------------------- With NDGRID + SUB2IND')
tic
for iter = 1:num_runs
[ii, jj] = ndgrid(1:M, 1:N);
B2 = A(sub2ind([M N M], ii, jj, g));
end
toc
这是运行时结果-
-------------------- With BSXFUN
Elapsed time is 2.090230 seconds.
-------------------- With NDGRID + SUB2IND
Elapsed time is 4.133219 seconds.
如您所见,bsxfun
基于基础的方法非常有效,既可以作为矢量化方法使用,又可以兼顾性能。
为什么bsxfun
在这里更好-
bsxfun
即时复制偏移元素并添加它们。
在另一种解决方案中,ndgrid
内部对进行两个函数调用repmat
,从而产生函数调用开销。在下一步中,sub2ind
花费时间添加偏移量以获得线性索引,从而带来另一个函数调用开销。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句