5

在 Matlab 中说我有一个这样的矩阵:

1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9

我现在需要在每个元素周围找到 3x3 的子矩阵(因此每个元素又是 3x3 子矩阵的中心)。中间的时候找fx没问题

1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9

这是子矩阵:

2 3 4
2 3 4
2 3 4

但是当在矩阵的边界,即第一个 og 最后一行或最后一列的元素时,当然不可能找到 3x3 子矩阵。相反,我需要适合的子矩阵。在角落里我会得到

1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9

其中子矩阵是:

1 2
1 2

在边界的中间,我得到了 fx:

1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9

这使:

4 5 6
4 5 6

或者作为另一个例子:

1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9

这使:

6 7 8
6 7 8

我希望你明白我的意思。我缺少一些功能,可以让我找到从元素到边界的距离。

我可以将每个元素视为子矩阵的中心,如果我可以测试,如果从元素到边界的距离低于子矩阵的边界(即子矩阵尺寸将改变,变为 5x5 子矩阵),那么我可以在制作子矩阵时截断它的一部分。

如何以最有效的方式找到从元素到矩阵边界的距离?

4

3 回答 3

4

尽管它没有直接回答您的问题,但我想您在更高的上下文中的问题是对 3x3 元素进行某种过滤或处理。通常解决方案是用额外的值填充数组,比如NaN. 然后您可以安全地提取 3x3 子矩阵,其中可能有一些NaNs.

您可以使用padarray命令进行填充。

编辑(1): 我已经阅读了您对另一个答案的评论。看起来您对检测边界情况更感兴趣,而不是计算距离。如果您想知道何时接近边界,那么创建蒙版怎么样?

mask = false(size(A));
mask(1:2,:) = true;
mask(end-1:end,:) = true;
mask(:,1:2) = true;
mask(:,end-1:end) = true;
于 2012-06-19T08:39:15.290 回答
2

让我们进一步说明这个问题:你有一个大小为 nxm 的矩阵,你选择了一个元素 i,j。你想知道元素 i,j 到边界的距离吗?那将是: min(i,j,ni,mj)

于 2012-06-19T08:39:15.430 回答
2
% Define the example data:

Matrix = repmat(1:9, 9, 1)

编辑:具有自由大小子矩阵的通用解决方案:(大小必须是奇数)

% Define the size of submatrix (square matrix assumed here).

SubmatrixSize = 5;

% Check that the size of submatrix is an odd number.

if (mod(SubmatrixSize, 2) == 0)
    error('SubmatrixSize must be odd number.');
end

Distance = floor(SubmatrixSize/2);

VertSize = size(Matrix, 1);
HorzSize = size(Matrix, 2);

for rowIndex = 1:VertSize
    yIndices = (rowIndex-Distance:rowIndex+Distance);
    yIndices = yIndices(find(yIndices >= 1 & yIndices <= VertSize));
    for colIndex = 1:HorzSize
        xIndices = (colIndex-Distance:colIndex+Distance);
        xIndices = xIndices(find(xIndices >= 1 & xIndices <= HorzSize));
        SubmatricesCellArray{rowIndex, colIndex} = Matrix(yIndices, xIndices);
    end
end

这是仅适用于 3x3 子矩阵的可能解决方案:

% This code only works for 3x3 submatrices.

VertSize = size(Matrix, 1);
HorzSize = size(Matrix, 2);

for rowIndex = 1:VertSize
    yIndices = nonzeros(rowIndex-1:rowIndex+1);
    if yIndices(end) > VertSize
        yIndices(end) = [];
    end
    for colIndex = 1:HorzSize
        xIndices = nonzeros(colIndex-1:colIndex+1);
        if xIndices(end) > HorzSize
            xIndices(end) = [];
        end
        SubmatricesCellArray{rowIndex, colIndex} = Matrix(yIndices, xIndices);
    end
end

然后你将拥有每个子矩阵SubmatricesCellArray{y, x}

于 2012-06-19T08:41:55.633 回答