使用2D矩阵进行3D矩阵索引

时间:2017-05-18 01:16:32

标签: matlab matrix multidimensional-array

有没有人能够了解如何在MATLAB中用单个命令替换这个^\s*\d+0\s+\d+0\s+.*$循环?

for

此处,for i = 1 : size(w,3) x=w(:,:,i); w1(i,:)=x(B(i),:); end clear x 是3D(w)矩阵,B(x by y by z)是包含与1 by z中每个层相关的行的向量。当w为w层深时,此for循环需要大约150秒才能执行。我试过用,

500000

这会创建一个大小为Q = w(B,:,:); Q = reshape(Q(1,:),[500000,2])'; 的矩阵Q,并且MATLAB会向我发出错误信息,说明内存超出范围。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

您正在创建中间变量(例如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循环来预填充索引。自从我试验小矩阵以来,我写了三个表达式。实际上,前三行可以用这样的方式编写,你根本不需要循环,它仍可以使用任何大小。我会把它留给你。