【问题标题】:3D matrix Indexing using 2D matrix3D 矩阵 使用 2D 矩阵进行索引
【发布时间】:2017-05-18 12:34:05
【问题描述】:

谁能解释一下这个for循环如何被MATLAB中的单个命令替换?

for i  = 1 : size(w,3)
    x=w(:,:,i);
    w1(i,:)=x(B(i),:); 
end
clear x

这里,w 是一个 3D (x by y by z) 矩阵,B (1 by z) 是一个向量,其中包含与 w 中的每一层相关的行。当 w 为 500000 层深时,此 for 循环执行大约需要 150 秒。我试过用,

Q = w(B,:,:);
Q = reshape(Q(1,:),[500000,2])';

这会创建一个大小为 500000 X 2 X 500000 的矩阵 Q,而 MATLAB 向我抛出了一个错误,提示内存超出范围。任何帮助将不胜感激!

【问题讨论】:

    标签: matlab matrix multidimensional-array


    【解决方案1】:

    您正在创建中间变量(例如 x)并使用 for 循环。以下方法的核心思想是首先预填充使用的索引,然后使用线性索引一次访问所有元素。然后,我们可以重新整形以获得想要的结果。

    ind = [B(1)*ones(size(w,2),1) (1:size(w,2)).' 1*ones(size(w,2),1)];
    ind = [ind; [B(2)*ones(size(w,2),1) (1:size(w,2)).' 2*ones(size(w,2),1)]];
    ind = [ind; [B(3)*ones(size(w,2),1) (1:size(w,2)).' 3*ones(size(w,2),1)]];
    lin_ind = sub2ind(size(w), ind(:,1), ind(:,2), ind(:,3));
    w1 = reshape(w(lin_ind),size(w,2),size(w,3)).'
    

    在我的系统上,这与w1 匹配,使用您问题中给出的循环计算。请注意,您可能需要使用 for 循环来预填充索引。自从我用小矩阵做实验以来,我写了三个表达式。实际上,前三行可以这样写,你根本不需要循环,它仍然适用于任何大小。我会留给你的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-02
      • 2019-10-20
      • 1970-01-01
      • 1970-01-01
      • 2015-02-04
      • 1970-01-01
      • 1970-01-01
      • 2013-09-21
      相关资源
      最近更新 更多