MATLAB, как лучше всего отследить границу в матрице, которая меняется на каждом шагу?

Я хочу рассчитать средний наклон или градиент на каждой итерации в такой матрице.

a=[ 10 9 8 7 6 5 5;
9  9 8 7 8 5 5; 
8  8 7 7 5 5 5; 
7  7 7 6 5 5 5;
6  6 6.6 5 5 5 5;
6  6 6.1 5 5 5 5;
6.3  5 5 5 5 5 5]

Где я хочу найти наклон или градиент между позицией a (1,1) во время каждого шага и в каждой точке, которая граничит со значением 5. Каждая итерация меняет положение 5, а также другие значения.

После этого я усредню наклон. Я еще не сталкивался с такой проблемой, и я не мог найти команду Matlab для упрощения.


person Abid    schedule 07.01.2012    source источник
comment
Ваш вопрос немного туманен. Можете ли вы предоставить более подробную информацию о том, что вы хотите сделать именно?   -  person Jorge    schedule 08.01.2012
comment
Думаю, некоторые детали моего проекта прояснят ситуацию. Матрица представляет собой значение высот. А программа имитирует радиально растущую дельту реки. Таким образом, каждая матрица выглядит примерно как квадрант круга. Я хочу взять наклон от начала координат до каждой ячейки вдоль края дельты. Край дельты встречается с уровнем моря, который в данном случае равен 5. После определения наклона каждой точки на краю дельты я хочу усреднить этот наклон.   -  person Abid    schedule 08.01.2012


Ответы (1)


Сначала вы должны выяснить, какие элементы побережья. Согласно вашему определению, элемент является элементом побережья, если он граничит (справа) с 5. Если уровень моря равен 5 и является наименьшим возможным значением, т. е. ни один элемент не выходит за уровень моря, то вы должны сначала найти все элементы земли как,

land=a>5;

Это возвращается,

ans =

     1     1     1     1     1     0     0
     1     1     1     1     1     0     0
     1     1     1     1     0     0     0
     1     1     1     1     0     0     0
     1     1     1     0     0     0     0
     1     1     1     0     0     0     0
     1     0     0     0     0     0     0

Теперь элементы побережья — это 1, за которыми следует 0. Возьмите разность столбцов матрицы земли,

coastTmp=diff(land,1,2);

возвращение,

ans =

     0     0     0     0    -1     0
     0     0     0     0    -1     0
     0     0     0    -1     0     0
     0     0     0    -1     0     0
     0     0    -1     0     0     0
     0     0    -1     0     0     0
    -1     0     0     0     0     0

и найдите -1s,

coast=find(coastTmp==-1);

которые,

coast =

     7
    19
    20
    24
    25
    29
    30

Отсюда легко. Градиент - это разность a(1,1) со всеми элементами берега, т.е.

slope=a(coast)-a(1,1);  % negative slope here

давать,

slope =

  -3.700000000000000
  -3.400000000000000
  -3.900000000000000
  -3.000000000000000
  -4.000000000000000
  -4.000000000000000
  -2.000000000000000

и, конечно, среднее значение,

mean(slope);
person Jorge    schedule 08.01.2012
comment
Вау большое спасибо. Я сделал примерно половину того, что вы сделали, эта функция поиска очень полезна! - person Abid; 08.01.2012
comment
Нп. Только что заметил опечатку. В начале его земля=a›5; не земля=а‹5;. В любом случае, вы должны знать, что этот код работает, только если элемент побережья имеет элемент моря справа от него. В любом другом случае он не обнаружит их, например. если элемент берега находится выше или ниже элемента моря. В таком случае вам придется усложнить их вычисление. - person Jorge; 08.01.2012
comment
В этом ответе есть множество проблем с деталями (значения индекса для coastTmp недействительны для a, потому что размеры разные и т. д.), но подход хорош. - person Ben Voigt; 08.01.2012
comment
Как значения индекса недействительны? - person Jorge; 08.01.2012
comment
Значения индекса действительны, когда я проверял. Это хорошо работает, потому что теперь я могу использовать ind2sub, чтобы найти строку и столбец в каждой точке, а также использовать тождество треугольника, чтобы найти расстояние до этой ячейки. - person Abid; 09.01.2012