[英]3d Matrix to 2d Matrix matlab
我正在使用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:将包含g
提供的dim-3索引和包含这些索引的索引添加到A中所需的偏移量,以获得所需的输出-
A(bsxfun(@plus,[1:M]',M*(0:N-1)) + M*N*(g-1))
这是一个快速的基准测试,用于将这种基于bsxfun
的方法与基于ndgrid + sub2ind
的解决方案 ( M
和N
为100
Luis解决方案)进行比较。
使用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
花费时间来添加偏移量以获得线性索引,从而带来另一个函数调用开销。
尝试使用sub2ind
。 假设g
被定义为M
x N
矩阵,可能值为1
,..., M
:
[ii, jj] = ndgrid(1:M, 1:N);
B = A(sub2ind([M N M], ii, jj, g));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.