在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
但是当在矩阵的边界,即第一行或最后一行或列中的元素时,它当然不可能找到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
我希望你理解我的观点。我遗漏了一些让我找到从元素到边界的距离的功能。
我可以将每个元素视为子矩阵的中心,如果我可以测试,如果从元素到边界的距离低于子矩阵的边界(子矩阵维度将改变,则fx为5x5子矩阵) ,然后我可以截断子矩阵的一部分。
如何以最有效的方式找到从元素到矩阵边界的距离?
答案 0 :(得分: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;
答案 1 :(得分:2)
让我们进一步指出问题:你有一个大小为nxm的矩阵,你选择一个元素i,j。你想知道边界元素i,j的距离吗?那将是:min(i,j,n-i,m-j)
答案 2 :(得分: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}
中拥有每个子矩阵。