Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 不使用循环提取矩阵的多个部分_C_Matlab - Fatal编程技术网

C 不使用循环提取矩阵的多个部分

C 不使用循环提取矩阵的多个部分,c,matlab,C,Matlab,我有一个巨大的3D矩阵,还有一个循环。在每次迭代中,我想从中提取一些不同的部分(例如:10000),然后计算这些部分和补丁之间的卷积 我知道使用循环可以很容易地完成,但这非常耗时。 有没有比循环更快的解决方案?让我们假设您有: 1) 包含零件左上角行索引的行向量idx 2) 包含零件左上角的列索引的行向量idy 3) 一个行向量idz,包含沿零件左角第三坐标的索引 我们首先必须从idx,idy和idz3向量中创建包含需要从矩阵中提取的元素的所有索引的向量。然后,我们将使用mat2cell将提取的

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

我知道使用循环可以很容易地完成,但这非常耗时。
有没有比循环更快的解决方案?

让我们假设您有:

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

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

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

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

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);

单元格数组的每个单元格现在都是您想要的输出之一

如果您知道要提取的元素索引,例如,
idx=[1 5 21 10000]
,那么您可以使用这个
idx
向量对原始3D矩阵进行索引,以提取所需的部分。您使用的是Matlab对的,而不是C?我想提取一些补丁,我只知道补丁左上角的索引,所以有一个大小为10000的矩阵,其中包含补丁左上角的索引!将A视为原始矩阵,我想从A中提取10000个面片。您知道所有面片左上角的索引,但您知道它们的大小吗?您用于与提取的矩阵部分进行卷积的面片是否始终相同(意味着提取的所有部分具有相同的大小)?或者,如果它不同,你如何计算它?非常感谢。这是非常有用的。最诚挚的问候:如果这个答案对你有用,请考虑将它标记为接受,以便其他人有同样的问题,它会知道它的工作原理。我很想比较一下你的旧代码和这段代码的计算速度。你好,对不起,我是学生,这几天我很忙!我将比较它们并将结果发送给您。