我有一个巨大的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矩阵中。
更多&回答...