Использование функции поиска по столбцам и строкам в Matlab - PullRequest
4 голосов
/ 26 февраля 2010

У меня возникли некоторые проблемы с функцией поиска в MATLAB. У меня есть матрица, состоящая из нулей и единиц (представляющих геометрию структурного элемента), где материал присутствует, когда матричный элемент = 1, и где нет материала, когда матричный элемент = 0. Матрица может иметь общий вид показано ниже (оно будет обновляться при изменении геометрии, но это не так уж важно).

                 Geometry = [0 0 0 0 0 0 0 0 0 0;
                             0 0 1 0 1 0 1 1 0 0;
                             0 0 1 0 0 0 0 1 0 0;
                             0 0 1 0 0 0 0 0 0 0;
                             0 0 0 0 0 0 0 1 0 0;
                             0 0 0 0 0 0 0 0 0 0;
                             0 0 1 0 0 0 0 1 0 0;
                             0 0 1 0 0 0 0 1 0 0;
                             0 0 1 1 1 1 0 1 0 0;
                             0 0 0 0 0 0 0 0 0 0;]

Я пытаюсь найти строки и столбцы, которые не связаны непрерывно (т. Е. Где строки и столбцы не равны 1 между внешними экстентами строки или столбца), а затем обновить их, чтобы они все связано. То есть матрица выше становится:

                Geometry =  [0 0 0 0 0 0 0 0 0 0;
                             0 0 1 1 1 1 1 1 0 0;
                             0 0 1 0 0 0 0 1 0 0;
                             0 0 1 0 0 0 0 1 0 0;
                             0 0 1 0 0 0 0 1 0 0;
                             0 0 1 0 0 0 0 1 0 0;
                             0 0 1 0 0 0 0 1 0 0;
                             0 0 1 0 0 0 0 1 0 0;
                             0 0 1 1 1 1 1 1 0 0;
                             0 0 0 0 0 0 0 0 0 0;]

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

В идеале, я хочу представить их в векторах, поэтому, пройдя по столбцам, найдите номер строки первого элемента, равный 1, и сохраните его в векторе с именем rowfirst.

т.е:.

                    rowfirst = zeros(1,numcols)
                    for i = 1:numcols % Going across the columns
                    rowfirst(i) = find(Geometry(i,1) == 1, 1,'first') 
                                       % Store values in vector called rowfirst
                    end

и повторите это для столбцов и найдите последние элементы в каждой строке.

По какой-то причине я не могу получить значения для правильного хранения в векторе, у кого-нибудь есть идея, где я ошибаюсь?

Заранее спасибо. Пожалуйста, дайте мне знать, если это не ясно, поскольку я, возможно, не очень хорошо объяснил проблему.

Ответы [ 4 ]

2 голосов
/ 26 февраля 2010

0) bwmorph(Geometry,'close') дозировать все в одну строку. Если отверстия могут быть больше, попробуйте bwmorph(Geometry,'close',Inf).

Относительно вашей попытки:

1) Это должно быть Geometry(i,:) вместо Geometry(i,1).

2) Ваша настоящая проблема здесь - пустые матрицы. На самом деле, что вы хотите, чтобы rowfirst(i) было, если в i-й строке нет 1-ых?

1 голос
/ 22 апреля 2014

Используйте функцию AccumArray (), чтобы найти минимальный и максимальный столбцы (строки).

Представьте, что вы нашли последнюю (первую) строку в каждом столбце, который содержит NaN.

a = [1 nan nan nan ;
     2 2   3   4;
     3 nan 3   3;
     4 nan 4   4]

Этот код получает индексы строк для последнего NaN в каждом столбце.

[row,col] = find(isnan(a))
accumarray(col,row,[],@max)

Этот код получает индексы строк для первого NaN в каждом столбце.

[row,col] = find(isnan(a))
accumarray(col,row,[],@min)

Поменяйте местами переменные row и col для сканирования по строкам, а не по столбцам.

Этот ответ основан на Поиск значения и индекса минимального значения в матрице, сгруппированной по значениям столбца

1 голос
/ 26 февраля 2010

Хорошо, я могу заметить две ошибки:

  • Вы должны использовать массив в качестве первого аргумента find. Итак, если вы хотите найти номер строки первого элемента каждого столбца , то вам следует использовать find(Geometry(:, i), 1, 'first').

  • Find возвращает пустой массив, если столбец содержит только нули. Вы должны обработать этот случай и решить, какое число вы хотите поместить в rownumber (например, вы можете указать -1, чтобы указать, что соответствующий столбец не содержит ненулевых элементов).

Следуя вышесказанному, вы можете попробовать это:

for i = 1:numcols
  tmp = find(Geometry(:, i), 1, 'first');
  if(tmp)
    rowfirst(i) = tmp;
  else
    rowfirst(i) = -1;
  end;
end;
1 голос
/ 26 февраля 2010

Я почти уверен, что есть более эффективный способ сделать это, но если вы замените свой звонок, чтобы найти его, он должен работать нормально:

find(Geometry(i,:), 1,'first') 

(иначе вы просто смотрите на первую ячейку i-й строки. И == 1 бесполезен, так как find уже возвращает только ненулевые элементы, а ваша матрица двоичная)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...