Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Скрипт для расчета границ между элементами матрицы

Автор вопроса: user3760558Ответов: 1

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

но есть ли другой способ, которым я могу обобщить или векторизовать мой необработанный и простой сценарий? Я задаю этот запрос, потому что моя реальная матрица очень велика, а использование for увеличивает время расчета.

Спасибо.

a1=[1 1 0 1 0 1;
    0 1 1 0 0 1;
    1 1 0 1 0 1;
    1 1 0 0 1 0;
    0 0 0 1 1 1]
m=5
n=6
cmp=zeros(m,n)
cmp1=zeros(m,n)
for i=1:m-1
    for j=1:n
        if a1(i,j)==a1(i+1,j) && a1(i,j)==1
            cmp(i,j)=1
        end
    end
    for i=1:m
        for j=1:n-1
            if a1(i,j)==a1(i,j+1) && a1(i,j)==1
                cmp1(i,j)=1
            end
        end
    end
end
cmtotal=cmp+cmp1
pc=sum(sum(cmtotal))

matlabperformancematrixvectorization

Ответы

Ответ 1 · рейтинг 3 · Divakar

Это должно быть довольно эффективным -

%// Case1 and case 2 matches
case1_matches = a1(1:end-1,:) == a1(2:end,:) & a1(1:end-1,:)==1
case2_matches = a1(:,1:end-1) == a1(:,2:end) & a1(:,1:end-1)==1

%// Get sum of those matches for the final output, equivalent to your pc
out = sum(case1_matches(:)) + sum(case2_matches(:))

Вы можете заменить sum(..(:)) на nnz(), но я сомневаюсь, что это будет лучше, чем sum с точки зрения производительности во время выполнения в соответствии с контрольные показатели sum по сравнению с nnz.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы