例如,如果我有一个10×10
矩阵,并且我在该矩阵中有一个n
坐标列表,我想在每个坐标周围放一个3×3
区域,调整大小它是一个9
长度的向量,然后将所有向量堆叠到9×n
矩阵中。我知道我可以写一个for循环来做这个,但这看起来很糟糕,虽然可能是我最终会做的。
答案 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));
当然,这不会检查位于矩阵边缘的坐标,如果有任何坐标,它将抛出错误。