Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
|
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
我有一个巨大的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 , BSXFUN或SUB2IND中的一个或多个。在这里可以找到有关矩阵索引的良好教程。 但是,由于您要寻求一种优雅的解决方案,因此这有点不寻常。它使用匿名函数以及ARRAYFUN和CAT函数: 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存储用于调用函数的函数句柄 。请注意,匿名函数使用的cam1的值是static 。即使变量cam1中的值发生更改,匿名函数仍会使用创建该函数时cam1中的值。 第二行调用ARRAYFUN,该函数将函数应用于数组的每个元素。 ARRAYFUN遍历x和y中的每个条目,并将值传递给indexFcn 。输出存储在result (一个15元素的单元格数组)中,其中每个单元格包含100 x 100矩阵。 第三行使用CAT函数将100 x 100矩阵连接到100 x 100 x 15矩阵中。 更多&回答... |
![]() |
![]() |