Мы делаем цикл for, который должен пройти через все строки и столбцы в матрице - PullRequest
0 голосов
/ 02 октября 2018

Нам интересно, как мы можем определить наши строки и столбцы, чтобы мы могли вставить все строки и столбцы в эту функцию

% V is our matrix
% i = columns of the matrix V
%j = rows of the matrix V
function quantity = neighbours(V,i,j)
    quantity = sum(sum(V(i-1:i+1,j-1:j+1)))-V(i,j)
end

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

У меня возникла странная идея, но она должна быть очень эффективной!Для этого вам просто нужно убедиться, что ваша матрица V имеет такое же количество строк, что и столбцы.Функция выведет матрицу с теми же размерами, что и V, содержащую в каждой позиции сумму всех прямых соседей (включая диагональных соседей).

function quantity = neighbours(V)
    n = length(V(1,:)); % Size of quadratic matrix
    v = ones(n,1);  % Vector used to create matrix A
    A = diag(v,1) + diag(v,-1);
    quantity = V*A+(V'*A)';
end

Объяснение: Вместо того, чтобы проходить матрицу итеративно,то, что может потребовать много вычислительного времени для больших систем, вы используете две простые матричные операции.

A выглядит следующим образом:

  [0 1 0 . .]
  [1 0 1 0 .]
A=[0 1 0 1 .]
  [. 0 1 0 .]
  [. . . . .]

Важно: Просто работает для квадратичных матриц!

0 голосов
/ 02 октября 2018

Если вы хотите получить вывод для всей матрицы V, вы можете определить окно с вашим желаемым размером и шаблоном окрестности, а затем сверить вашу матрицу V с ним:

Например, для суммы 8 окрестностей вы можетеdo:

function quantity = neighbours(V)
    w = [1 1 1; 1 0 1; 1 1 1]; % define a window for summing 8-neigborhood of a pixel 
    quantity  = conv2(V, w, 'same'); % result matrix
end

Если вам нужно, скажем, 4-соседство, вы можете заменить w выше:

w = [0 1 0; 1 0 1; 0 1 0];
0 голосов
/ 02 октября 2018

Я все еще не уверен, что полностью понимаю проблему, но я чувствую, что мы не сможем продвинуться дальше без попытки.Так что это ваша функция, но она принимает во внимание края.Если вы новичок в MatLab, это должно быть сохранено в дополнительном файле с именем 'liebours.m'.

function quantity = neighbours(V,i,j)
height=size(V,1);
width=size(V,2);
quantity = sum(sum(V(max(i-1,1):min(i+1,height),max(1,j-1):min(j+1,width))))-V(i,j);
end

Если строка или столбец находится на краю матрицы, скажем (1,1) площадь уменьшается, чтобы оставаться внутри матрицы.в противном случае вы получите сообщение об ошибке (возможно, «индексы нижнего индекса должны быть либо натуральными положительными целыми числами, либо логическими значениями».) При этом вы можете просто пройтись по матрице, которая не является эффективной, но сработает.Этот код может быть запущен где угодно, кроме файла 'neighbours.m'

codeV = ones(5,3);
amount_of_neighbors = zeros(size(zcodeV));
for i=1:size(zcodeV,1) %height
    for j=1:size(zcodeV,2) %width
        amount_of_neighbors(i,j) = neighbours(codeV,i,j);
    end
end

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