Matlab:复制数组的菱形部分

时间:2015-02-06 20:16:16

标签: matlab matrix-indexing

假设数组是:

A =    a b c
       d e f
       g h i

我想将钻石排列,即元素d,b,f,h,e复制到新的1D阵列中。上面的数组只是一个例子,矩阵可以是任何大小的矩形矩阵,钻石的位置可以是数组中的任何位置。

3 个答案:

答案 0 :(得分:1)

如果您拥有图像处理工具箱,这是一个可行的解决方案。

执行形态学操作时,可以使用钻石形状的结构元素(检查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

希望有所帮助!

答案 1 :(得分:1)

这可以通过构建具有所需菱形和指定中心的蒙版(逻辑索引)来实现。通过计算钻石中心每个条目的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

答案 2 :(得分:0)

假设您只按照指定的顺序查找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);