3D矩阵到2D矩阵Matlab

Nfernand

我正在使用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中提出了基于解决方案路易斯的解决方案MN100

使用的基准测试代码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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从3D单元阵列中提取数据到2D矩阵-MATLAB

来自分类Dev

如何在Matlab中将2D矩阵序列存储到3D数组中?

来自分类Dev

在Matlab中合并2D矩阵以形成3D矩阵

来自分类Dev

在MATLAB中将3D矩阵调整为2D矩阵

来自分类Dev

Matlab将2D矩阵转换为3D矩阵

来自分类Dev

MATLAB:将 2D 矩阵与元胞数组内的 3D 矩阵相乘

来自分类Dev

通过在 Matlab 中内插 3D 矩阵的层来获得内插的 2D 矩阵

来自分类Dev

从2D矩阵动态填充3D矩阵

来自分类Dev

将3D矩阵与2D矩阵相乘

来自分类Dev

将3D矩阵与2D矩阵相乘得到2D矩阵

来自分类Dev

2D矩阵的Theano矩阵相乘得到3d矩阵

来自分类Dev

将2D矩阵的Numpy矩阵相乘得到3D矩阵

来自分类Dev

MATLAB:将3d数组与2d矩阵相乘并通过矢量化求和

来自分类Dev

Matlab 3D矩阵通过2D矩阵矢量化对三维进行转换

来自分类Dev

2D坐标到3D坐标分辨率和相机矩阵

来自分类Dev

R中的2D矩阵到3D堆叠数组

来自分类Dev

2D坐标到3D坐标分辨率和相机矩阵

来自分类Dev

R 3D阵列到2D矩阵

来自分类Dev

将2个2d矩阵相乘得到3d矩阵

来自分类Dev

将2d矩阵转换为3d一个热矩阵numpy

来自分类Dev

3D矩阵元素与2D矩阵副本的高效逐元素乘法?

来自分类Dev

使用张量流将3D矩阵重塑为2D矩阵

来自分类Dev

如何使用OpenCV C ++将3D矩阵划分为2D矩阵束

来自分类Dev

将3D矩阵转换/重塑为2D矩阵

来自分类Dev

折叠其中一个维度的3d矩阵以制作2d矩阵

来自分类Dev

将3D矩阵拆分为多个2D矩阵

来自分类Dev

将2D矩阵的1广播到1-hot 3D矩阵

来自分类Dev

从2D矩阵中基于3D矩阵的位置获取值

来自分类Dev

将2D稀疏矩阵转换为3D矩阵