我有一个巨大的2D矩阵,我想提取15个不同的100×100份出的。我有两个矢量x和y在左上索引的部分是保存。我已经使用了这样的事情:

result = cam1(x(1:end):(x(1:end)+99), y(1:end):(y(1:end)+99));

但结果只是一个100×100矩阵,而不是一个15x100x100.为什么?

我知道这可能很容易地完成使用循环,但我们不允许使用循环(这一部分的图像处理锻炼)。另一个利我们会被写的所有15线,但这是一种丑陋的。

你有任何优雅的解决方案吗?谢谢。

有帮助吗?

解决方案

有许多方法可以做到这一点,没有循环。大多数的解决方案涉及扩大矢量 xy 成更大的矩阵的指数和可能使用一个或更多的功能 REPMAT, BSXFUN, 或 SUB2IND.一个很好的教程为基质的索引可以找到 在这里,.

然而,由于你的要求 优雅 解决方案,这是一个有点不寻常。它使用 匿名的功能 以及功能 ARRAYFUN:

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

说明:

第一线创建一个 匿名的功能.这是一个简单的一线的功能,可以创建的飞行没有必要把它放在一个m-文件。该功能的定义的两个投入 rc 这是用来抽取100-通过-100子矩阵从 cam1.变量 indexFcn 一个商店 功能处理 这是用来打电话的功能。注意,值的 cam1 用的匿名的功能 .即使该价值的变量 cam1 改变的,匿名的功能仍然使用价值, cam1 当功能的创建。

第二线呼叫ARRAYFUN,其中适用一个功能每个元件阵列。ARRAYFUN循环中的每一项 xy, 传递的价值观来 indexFcn.输出存在 结果,, 15-电池元件阵列,其中每个单元包含一个100-通过-100矩阵。

第三行中使用的猫功能的连接的100-通过-100矩阵变成一个100-通过-100-通过-15矩阵。

其他提示

由于这是明显的功课,我不会给你完整的答案。

有几种方式来索引到一个矩阵。当你有一个分散的指标集,因为这是,你需要使用一个索引。因此,如果

A = rand(5,6)
A =
      0.81472      0.09754      0.15761      0.14189      0.65574      0.75774
      0.90579       0.2785      0.97059      0.42176     0.035712      0.74313
      0.12699      0.54688      0.95717      0.91574      0.84913      0.39223
      0.91338      0.95751      0.48538      0.79221      0.93399      0.65548
      0.63236      0.96489      0.80028      0.95949      0.67874      0.17119

A(3:4,3:4)

将产生从A 2x2的子矩阵但是,我们也可以发现,小矩阵为

reshape(A([13 14 18 19]),[2 2])
ans =
      0.95717      0.91574
      0.48538      0.79221

我为什么选择这个指标集?要知道答案,你需要了解sub2ind。

[I,J] = ndgrid(3:4,3:4);
sub2ind([5 6],I(:),J(:))
ans =
    13
    14
    18
    19

在结束时,它看起来像您想从提取份15x100x100阵列。所以从我展示的作品建立必要的索引阵列了。您需要在年底前做最后的重塑,使其正确的形状。

这应该给你足够的启动来完成你的功课。

您认为所有远到难,试试这个:mat2cell

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top