【问题标题】:3d Matrix to 2d Matrix matlab3d 矩阵到 2d 矩阵 matlab
【发布时间】:2015-02-04 23:27:06
【问题描述】:

我正在使用 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) 之类的东西,但不出所料,这些都不起作用。有没有类似的?

【问题讨论】:

  • 我觉得这属于某个 matlab 论坛。不太确定与计算机编程的相关性
  • 如果以下任何解决方案解决了您的问题,请考虑通过单击旁边的空心复选标记来接受它?谢谢!

标签: matlab matrix indexing vectorization


【解决方案1】:

您可以使用最好的矢量化工具,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 的方法与Luis's solution 中提出的基于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 花时间添加偏移量以获得线性索引,从而带来另一个函数调用开销。

【讨论】:

    【解决方案2】:

    尝试使用sub2ind。这假设g 被定义为MxN 矩阵,其可能值为1,...,M:

    [ii, jj] = ndgrid(1:M, 1:N);
    B = A(sub2ind([M N M], ii, jj, g));
    

    【讨论】:

      猜你喜欢
      • 2013-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多