2015-02-06 17 views
2

Предположим, что массив:Matlab: Скопировать алмазное часть массива

A = a b c 
     d e f 
     g h i 

Я хочу скопировать расположение алмазную, т.е. элементы D, B, F, Н, Е в новый 1D массив. Вышеупомянутый массив является всего лишь примером, матрица может представлять собой прямоугольную матрицу любого размера, а местоположение алмаза может находиться где угодно внутри массива.

+0

кратчайшего или наиболее эффективным? Вас интересуют только 3-на-3 матрицы или произвольные квадратные матрицы или даже прямоугольные матрицы? И я предполагаю, что вы хотите скопировать эти элементы в массив нулей? Измените свой вопрос, чтобы прояснить эти проблемы. – horchler

+0

Да, наиболее эффективный код и матрица могут быть прямоугольными, а расположение алмазов может быть в любом месте большого массива. Я просто хочу получить эту идею, используя пример выше ... – HIMANK

+0

Привет @HIMANK, так ли какой-либо ответ ниже помог вам решить вашу проблему? Если это так, отметьте его как принято. Благодаря! –

ответ

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 
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); 
1

Вот решение, которое может работать, если у вас есть изображение Processing Toolbox.

При выполнении морфологических операций имеется структурирующий элемент в форме алмаза, который вы можете использовать (отметьте here). Теперь, если мы будем играть с ним, мы можем извлечь элементы из такой матрицы. Обратите внимание, что поскольку у вас есть строки в AI использовать массив ячеек:

clear 
clc 

A = {'a' 'b' 'c';'d' 'e' 'f'; 'g' 'h' 'i'} 

SE = strel('diamond', 1) 

Matlab говорит нам, что SE имеет следующие атрибуты (на самом деле это не может быть атрибутом ... Я не знаю, правильной терминологии извините: Р):

SE = 

Flat STREL object containing 5 neighbors. 

Neighborhood: 
    0  1  0 
    1  1  1 
    0  1  0 

Таким образом, мы можем использовать getnhood метод STREL, как логические индексы для извлечения усваивает значения в а:

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

BAHA! Как элегантно! – rayryeng

+0

О, спасибо за это @rayryeng! –