有没有人能够了解如何在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会向我发出错误信息,说明内存超出范围。任何帮助将不胜感激!
答案 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循环来预填充索引。自从我试验小矩阵以来,我写了三个表达式。实际上,前三行可以用这样的方式编写,你根本不需要循环,它仍可以使用任何大小。我会把它留给你。