在不使用循环

时间:2015-12-09 09:27:28

标签: c matlab

我有一个巨大的3D矩阵,并且有一个循环。在每次迭代中,我想从中提取一些不同的部分(例如:10000),然后计算这些部分和补丁之间的卷积。

我知道可以使用循环轻松完成,但这非常耗时。 是否有任何替代解决方案比循环更快地工作?

1 个答案:

答案 0 :(得分:1)

我们假设你有:

1)行向量idx,包含零件左上角的行索引。

2)行向量idy,包含零件左上角的列索引。

3)行向量idz,包含沿着零件左角第3个坐标的索引。

我们首先必须从idxidyidz 3向量创建包含您需要从矩阵中提取的元素的所有索引。然后我们将使用mat2cell将提取的矩阵拆分为与补丁大小相同的块,然后我们将使用convncellfun函数应用于每个块。

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.

idyidz执行相同操作后,我们会获得包含所有所需索引的3个向量TotidxTotidyTotidz

现在我们可以从初始矩阵中提取值,比如A

ExtractedA=A(Totidx,Totidy,Totidz);

应用mat2cellNPatch表示您提取的补丁数量

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的每个单元格现在都是您想要的输出之一