我有一个巨大的3D矩阵,并且有一个循环。在每次迭代中,我想从中提取一些不同的部分(例如:10000),然后计算这些部分和补丁之间的卷积。
我知道可以使用循环轻松完成,但这非常耗时。 是否有任何替代解决方案比循环更快地工作?
答案 0 :(得分:1)
我们假设你有:
1)行向量idx
,包含零件左上角的行索引。
2)行向量idy
,包含零件左上角的列索引。
3)行向量idz
,包含沿着零件左角第3个坐标的索引。
我们首先必须从idx
,idy
和idz
3向量创建包含您需要从矩阵中提取的元素的所有索引。然后我们将使用mat2cell
将提取的矩阵拆分为与补丁大小相同的块,然后我们将使用convn
将cellfun
函数应用于每个块。
Totidx=bsxfun(@plus,idx,[0:(size(patch,1)-1)]'); \\i-th column of this is the column vector idx(i):(idx(i)+size(patch,1)-1)
Totidx=reshape(Totidx,1,numel(Totidx)); \\ Creates the vector needed containing all indexes along first dimension.
对idy
和idz
执行相同操作后,我们会获得包含所有所需索引的3个向量Totidx
,Totidy
,Totidz
。
现在我们可以从初始矩阵中提取值,比如A
:
ExtractedA=A(Totidx,Totidy,Totidz);
应用mat2cell
:NPatch
表示您提取的补丁数量
B=mat2cell(ExtractedA,size(patch,1)*ones(1,NPatch),size(patch,2)*ones(1,NPatch),size(patch,3)*ones(1,NPatch));
然后,您可以将convn
函数应用于单元格数组B
的每个单元格:patch
表示您想要使用
fun=@(M) convn(M,patch,'valid');
out=cellfun(fun,B,'uniformoutput',false);
单元格数组out
的每个单元格现在都是您想要的输出之一