【问题标题】:How can I extract n elements from each m-by-m window of a matrix without using loops in MATLAB?如何在不使用 MATLAB 循环的情况下从矩阵的每个 m×m 窗口中提取 n 个元素?
【发布时间】:2011-03-15 16:21:20
【问题描述】:

我有一个矩阵和 2 个参数。第一个参数n是要选择的元素个数。第二个是窗口大小m

我想从矩阵的每个m-by-m 窗口中选择n 的元素数量。结果,我们将有一个p-by-q 单元格数组,其中pmatrix_height/mqmatrix_width/m

元胞数组的每个元素都包含来自相应窗口的n 最大数字。它不一定是元胞数组,它可以是任何可以存储必要数据的东西。

【问题讨论】:

标签: matlab matrix


【解决方案1】:

一种方法是首先使用函数IM2COL找到矩阵的所有唯一m-by-m子矩阵,然后使用函数SORT对每一列进行降序排序,然后最后提取顶部n 行。如果你的初始矩阵是A,而你的输出矩阵是B,它会是这样的:

B = sort(im2col(A,[m m],'distinct'),1,'descend');
B = B(1:n,:);  %# Get the top n values

请注意,B 将是一个 n-by-m^2 矩阵。如果你想把它变成一个p-by-q 单元格数组,你可以使用函数NUM2CELLRESHAPE

nBlocks = ceil(size(A)./m);  %# The number of blocks in each dimension
B = reshape(num2cell(B,1),nBlocks(1),nBlocks(2));

编辑:

如果您还想获取每个值相对于输入矩阵A 的索引,那就有点复杂了。您可以通过从SORT 获取第二个输出来做到这一点,在这种情况下,这将是每个m-by-m 子矩阵中值的线性索引。您可以使用函数IND2SUB 将它们转换为下标,然后移动行和列索引以说明每个m-by-m 块的位置:

[B,index] = sort(im2col(A,[m m],'distinct'),1,'descend');
B = B(1:n,:);                  %# Get the top n values
index = index(1:n,:);          %# Get the top n values
[r,c] = ind2sub([m m],index);  %# Convert linear indices to subscripts
nBlocks = size(A)./m;          %# The number of blocks in each dimension
r = r+repmat(0:m:(nBlocks(1)-1)*m,n,nBlocks(2));      %# Shift the row indices
c = c+kron(0:m:(nBlocks(2)-1)*m,ones(n,nBlocks(1)));  %# Shift the column indices

现在您可以使用函数MAT2CELLRESHAPE 将行索引、列索引和值一起收集到一个元胞数组中:

B = mat2cell([r(:) c(:) B(:)],n.*ones(1,size(B,2)));
B = reshape(B,nBlocks(1),nBlocks(2));

或者,您可以使用 NUM2CELLSTRUCTRESHAPE 函数创建结构体数组而不是元胞数组:

B = struct('rowIndices',num2cell(r,1),...
           'colIndices',num2cell(c,1),...
           'values',num2cell(B,1));
B = reshape(B,nBlocks(1),nBlocks(2));

注意:

如果A 的维度不是m 的偶数倍,函数IM2COL 将用零填充部分块。如果此零填充中的任何一个出现在块的顶部 n 值中,则相应的行和列索引中的一个或两个将超出范围(即具有大于矩阵 @ 的该维度的大小的值987654356@)。因此,通过检查行索引和列索引是否在范围内,您可以确保在后续分析中不包括任何零填充。

【讨论】:

  • 非常感谢新手......这很酷......但它实际上会从每个窗口中给出矩阵的元素......我想要的是它也应该给出那些的位置值 w.r. 到原始矩阵。并且每个窗口都应该用索引 p 和 q 索引来识别,索引包含矩阵元素本身以及它所在元素的坐标。
  • 再次感谢 gnovice...您的评论是正确的...它可以更改为像这样的 p-by-q 数组...唯一缺少的是这些所在的行和列号值实际上位于矩阵 A 中。例如,描绘第一个窗口的 cellarray(1,1) 应导致 [col_num row_mum value] ...我希望现在很清楚。山
  • @Shan:获取原始矩阵的行和列索引要复杂得多。这需要更多时间才能弄清楚。
  • @gnovice 希望你有空的时候试试看。
  • @Shan:我还添加了一个注意事项,您应该特别注意。
猜你喜欢
  • 2013-11-30
  • 1970-01-01
  • 2011-10-29
  • 2010-10-28
  • 1970-01-01
  • 2021-12-31
  • 2020-04-28
  • 1970-01-01
  • 2013-03-20
相关资源
最近更新 更多