在 MATLAB 中定义数组中的像素邻域

计算科学 matlab 算法 矩阵
2021-12-04 10:19:19

我正在使用 MATLAB 中的矩阵运算,我会遇到以下问题。我有包含零元素的矩阵:

a=zeros(100,100)

和另一个包含值 6 的维度明显更小的矩阵:

b=6*ones(3,3)

我在矩阵中定义了一些坐标aa(45,50)我也将这一点视为矩阵的中心 b(2,2)我需要将矩阵a中的元素复制到矩阵b,其中心由 定义b(2,2)我只知道可以通过在 matrix 中定义坐标来手动完成a请问有什么办法,或者内置的MATLAB函数如何自动完成?我只是 MATLAB 初学者。

2个回答

只是为了显示,只要你做对了,以下工作:你不要试图复制b之外的值a,因为你没有指定当你在 时应该做什么a(100,100)我的选择是具有环形拓扑的循环移位。

% a = zeros(100); aX = 45 ; aY = 50; 
a = zeros(12); aCenter = [4 6];
b = 6 * ones(3); bCenter = ceil(size(b)/2);

a(circshift(padarray(true(size(b)),size(a)-size(b),'post'),aCenter-bCenter))=b;

基本上,这会创建一个b与 相同大小的 2D 逻辑索引,a左上角有一个:

padarray(true(size(b)),size(a)-size(b),'post')

然后circshift通过向量移动这个模式aCenter-bCenter

circshift(...)

最后,a具有上述逻辑索引的元素会受到 中的值的影响b

您可以使用 sparse 函数轻松做到这一点,该函数允许您通过提供非零索引列表来构造矩阵。这是一个简短的例子。请注意,我已经格式化了本地块以显示矩阵结构,即使它们表示为向量。

% Define i indices in local coordinates
i = [-1,  0,  1,...
     -1   0   1,...
     -1   0   1];
% Define j indices in local coordinates
j = [ 1,  1,  1,...
      0   0   0,...
     -1  -1  -1];
% Construct 100 x 100 sparse matrix by using offsets
a = sparse(i + 45, j + 50, 6, 100, 100);
% Show subset of matrix
full(a(43:47, 48:52))