Matlab:复制数组的菱形部分
Matlab: Copy a diamond portion of an array
假设数组是:
A = a b c
d e f
g h i
我想复制菱形排列,即元素 d、b、f、h、e 到一个新的一维数组中。上面的数组只是一个例子,矩阵可以是任意大小的矩形矩阵,菱形的位置可以在数组中的任意位置。
假设您只寻找 5 元素钻石,按照您指定的顺序,您可以这样做:
% Previously locate the position of the middle element (e)
% and store it in variable IND
[i, j] = ind2sub(size(A), IND);
J = sub2ind(size(A), i+[0 -1 0 1 0], j+[-1 0 +1 0 0]);
% Get diamond-linearized vector
dia = A(J);
如果您有图像处理工具箱,这里有一个可行的解决方案。
执行形态学运算时,可以使用菱形结构元素(检查here)。现在,如果我们玩弄它,我们可以像这样从矩阵中提取元素。请注意,由于您在 A 中有字符串,因此我使用元胞数组:
clear
clc
A = {'a' 'b' 'c';'d' 'e' 'f'; 'g' 'h' 'i'}
SE = strel('diamond', 1)
Matlab 告诉我们 SE
具有以下属性(实际上它可能不是属性...我不知道正确的术语抱歉 :P):
SE =
Flat STREL object containing 5 neighbors.
Neighborhood:
0 1 0
1 1 1
0 1 0
因此,我们可以使用STREL的getnhood
方法作为逻辑索引来获取A中适当的值:
NewMatrix = transpose(A(SE.getnhood()))
NewMatrix =
'd' 'b' 'e' 'h' 'f'
这里使用转置,按照从上到下,从左到右的顺序取值。
所以整个代码实际上是这样的:
A = {'a' 'b' 'c';'d' 'e' 'f'; 'g' 'h' 'i'}
DSize = 1; %// Assign size to diamond.
SE = strel('diamond', DSize)
NewMatrix = transpose(A(SE.getnhood()))
如果您需要移动数组中的菱形以使其中心位于其他位置,您可以在使用最后一行之前转换结构元素。该函数被恰当地命名为 translate
希望对您有所帮助!
这通过构建具有所需菱形和指定中心的掩码(逻辑索引)来实现。通过计算从每个条目到菱形中心的 L1 (or taxicab) distance 并与适当的阈值进行比较来获得掩码:
A = rand(7,9); %// example matrix
pos_row = 3; %// row index of diamond center
pos_col = 5; %// col index of diamond center
[n_rows, n_cols] = size(A);
d = min([pos_row-1 pos_col-1 n_rows-pos_row n_cols-pos_col]); %// distance threshold
%// to be used for mask. Obtained by extending until some matrix border is found
ind = bsxfun(@plus, abs((1:n_rows).'-pos_row), abs((1:n_cols)-pos_col))<=d; %'// mask
result = A(ind); %// get entries defined by mask
假设数组是:
A = a b c
d e f
g h i
我想复制菱形排列,即元素 d、b、f、h、e 到一个新的一维数组中。上面的数组只是一个例子,矩阵可以是任意大小的矩形矩阵,菱形的位置可以在数组中的任意位置。
假设您只寻找 5 元素钻石,按照您指定的顺序,您可以这样做:
% Previously locate the position of the middle element (e)
% and store it in variable IND
[i, j] = ind2sub(size(A), IND);
J = sub2ind(size(A), i+[0 -1 0 1 0], j+[-1 0 +1 0 0]);
% Get diamond-linearized vector
dia = A(J);
如果您有图像处理工具箱,这里有一个可行的解决方案。
执行形态学运算时,可以使用菱形结构元素(检查here)。现在,如果我们玩弄它,我们可以像这样从矩阵中提取元素。请注意,由于您在 A 中有字符串,因此我使用元胞数组:
clear
clc
A = {'a' 'b' 'c';'d' 'e' 'f'; 'g' 'h' 'i'}
SE = strel('diamond', 1)
Matlab 告诉我们 SE
具有以下属性(实际上它可能不是属性...我不知道正确的术语抱歉 :P):
SE =
Flat STREL object containing 5 neighbors.
Neighborhood:
0 1 0
1 1 1
0 1 0
因此,我们可以使用STREL的getnhood
方法作为逻辑索引来获取A中适当的值:
NewMatrix = transpose(A(SE.getnhood()))
NewMatrix =
'd' 'b' 'e' 'h' 'f'
这里使用转置,按照从上到下,从左到右的顺序取值。
所以整个代码实际上是这样的:
A = {'a' 'b' 'c';'d' 'e' 'f'; 'g' 'h' 'i'}
DSize = 1; %// Assign size to diamond.
SE = strel('diamond', DSize)
NewMatrix = transpose(A(SE.getnhood()))
如果您需要移动数组中的菱形以使其中心位于其他位置,您可以在使用最后一行之前转换结构元素。该函数被恰当地命名为 translate
希望对您有所帮助!
这通过构建具有所需菱形和指定中心的掩码(逻辑索引)来实现。通过计算从每个条目到菱形中心的 L1 (or taxicab) distance 并与适当的阈值进行比较来获得掩码:
A = rand(7,9); %// example matrix
pos_row = 3; %// row index of diamond center
pos_col = 5; %// col index of diamond center
[n_rows, n_cols] = size(A);
d = min([pos_row-1 pos_col-1 n_rows-pos_row n_cols-pos_col]); %// distance threshold
%// to be used for mask. Obtained by extending until some matrix border is found
ind = bsxfun(@plus, abs((1:n_rows).'-pos_row), abs((1:n_cols)-pos_col))<=d; %'// mask
result = A(ind); %// get entries defined by mask