MATLAB爱好者论坛-LabFans.com

MATLAB爱好者论坛-LabFans.com (https://www.labfans.com/bbs/index.php)
-   资料存档 (https://www.labfans.com/bbs/forumdisplay.php?f=72)
-   -   MATLAB:在不使用循环的情况下提取矩阵的多个部分 (https://www.labfans.com/bbs/showthread.php?t=22678)

poster 2019-12-10 16:49

MATLAB:在不使用循环的情况下提取矩阵的多个部分
 
我有一个巨大的2D矩阵,我想从中提取15个不同的100x100零件。我有两个向量x和y,其中保存了零件的左上索引。我用过这样的东西:

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

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

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


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

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

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

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

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

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



[url=https://stackoverflow.com/questions/906077]更多&回答...[/url]


所有时间均为北京时间。现在的时间是 23:47

Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.