Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
 
 
主题工具 显示模式
旧 2019-12-10, 16:49   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 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行,但这有点丑陋。

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


回答:
您可以通过多种方式来实现此目的而无需循环。大多数解决方案都涉及将向量xy扩展为更大的索引矩阵,并且可能会使用函数REPMATBSXFUNSUB2IND中的一个或多个。在这里可以找到有关矩阵索引的良好教程。

但是,由于您要寻求一种优雅的解决方案,因此这有点不寻常。它使用匿名函数以及ARRAYFUNCAT函数:

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

第一行创建一个匿名函数 。这是一个简单的单行函数,可以即时创建,而不必将其放入m文件中。该函数定义了两个输入rc ,用于从cam1中提取100×100子矩阵。变量indexFcn存储用于调用函数的函数句柄 。请注意,匿名函数使用的cam1的值是static 。即使变量cam1中的值发生更改,匿名函数仍会使用创建该函数时cam1中的值。

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

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



更多&回答...
poster 当前离线   回复时引用此帖
 

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



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


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