是否可以将矩阵中的多个局部区域转换为新矩阵?

时间:2016-04-02 14:49:29

标签: matlab matrix

例如,如果我有一个10×10矩阵,并且我在该矩阵中有一个n坐标列表,我想在每个坐标周围放一个3×3区域,调整大小它是一个9长度的向量,然后将所有向量堆叠到9×n矩阵中。我知道我可以写一个for循环来做这个,但这看起来很糟糕,虽然可能是我最终会做的。

2 个答案:

答案 0 :(得分:2)

我不确定这是否比for循环更高效,但您可以对索引值进行一些计算。

data = magic(5);

%//     17    24     1     8    15
%//     23     5     7    14    16
%//      4     6    13    20    22
%//     10    12    19    21     3
%//     11    18    25     2     9

%// The coordinates you want to sample at (row, col)
coords = [2 3; 3 2; 2 4];

%// Determine the row and column offsets to apply for a 3x3 block
[rowOffset, colOffset] = ndgrid(-1:1,-1:1);

%// Compute the rows and columns included in each block centered t each point
rows = bsxfun(@plus, coords(:,1).', rowOffset(:));
cols = bsxfun(@plus, coords(:,2).', colOffset(:));

%// Convert to absolute linear index and sample data at these regions
newdata = data(sub2ind(size(data), rows, cols));

%//   24    23     1
%//    5     4     7
%//    6    10    13
%//    1     5     8
%//    7     6    14
%//   13    12    20
%//    8     7    15
%//   14    13    16
%//   20    19    22

话虽如此,取决于你想对每个群体做什么,你可以潜在地使用卷积或其他东西来完成同样的事情。

答案 1 :(得分:1)

假设坐标已经是索引形式,您可以使用:

m = 10;
A = rand(m);
cc = [23; 47; 64];
ind = bsxfun(@plus, [(-1:1) - m, (-1:1), (-1:1) + m], cc);
newVals = A(ind);

或首先将坐标转换为索引形式:

c1 = [3 3; 7 5; 4 7];
cc = sub2ind(size(A), c1(:,1), c1(:,2));

当然,这不会检查位于矩阵边缘的坐标,如果有任何坐标,它将抛出错误。