PDA

查看完整版本 : MATLAB:在不使用循环的情况下提取矩阵的多个部分


poster
2019-12-10, 16:49
我有一个巨大的2D矩阵,我想从中提取15个不同的100x100零件。我有两个向量x和y,其中保存了零件的左上索引。我用过这样的东西:

result = cam1(x(1:end):(x(1:end)+99), y(1:end):(y(1:end)+99)); 但结果只是一个100x100的矩阵,而不是15x100x100的矩阵。为什么?

我知道可以使用循环轻松完成此操作,但是我们不允许使用循环(这是图像处理工作的一部分)。另一个可能性是写全部15行,但这有点丑陋。

您有什么优雅的解决方案吗?谢谢。


回答:
您可以通过多种方式来实现此目的而无需循环。大多数解决方案都涉及将向量x和y扩展为更大的索引矩阵,并且可能会使用函数REPMAT (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/repmat.html) , BSXFUN (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/bsxfun.html)或SUB2IND中的 (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/sub2ind.html)一个或多个。在这里 (http://www.mathworks.com/company/newsletters/digest/sept01/matrix.html)可以找到有关矩阵索引的良好教程。

但是,由于您要寻求一种优雅的解决方案,因此这有点不寻常。它使用匿名函数 (http://www.mathworks.com/access/helpdesk/help/techdoc/matlab_prog/f4-70115.html)以及ARRAYFUN (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/arrayfun.html)和CAT (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/cat.html)函数:

indexFcn = @(r,c) cam1(r:(r+99),c:(c+99)); result = arrayfun(indexFcn,x,y,'UniformOutput',false); result = cat(3,result{:}); 说明:

第一行创建一个匿名函数 。这是一个简单的单行函数,可以即时创建,而不必将其放入m文件中。该函数定义了两个输入r和c ,用于从cam1中提取100×100子矩阵。变量indexFcn存储用于调用函数的函数句柄 (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/function_handle.html) 。请注意,匿名函数使用的cam1的值是static 。即使变量cam1中的值发生更改,匿名函数仍会使用创建该函数时cam1中的值。

第二行调用ARRAYFUN,该函数将函数应用于数组的每个元素。 ARRAYFUN遍历x和y中的每个条目,并将值传递给indexFcn 。输出存储在result (一个15元素的单元格数组)中,其中每个单元格包含100 x 100矩阵。

第三行使用CAT函数将100 x 100矩阵连接到100 x 100 x 15矩阵中。



更多&回答... (https://stackoverflow.com/questions/906077)