суммирование подматриц матрицы без использования циклов - PullRequest
1 голос
/ 26 января 2020

У меня есть код, который суммирует подэлемент 8 на 8 из матрицы 256 на 256, чтобы получить меньшую матрицу размера 32 на 32. Я использую циклы, которые замедляют процесс. Можно ли это сделать без использования l oop? Мне нужно использовать этот суммирующий код в инструменте оптимизации CVX, который не очень хорошо работает со встроенными функциями MATLAB. Таким образом, это должен быть код без встроенных вычислений (хотя допускается сумма и среднее).

img=rand(256);
m=1;
n=1;
for i=1:8:256
    for j=1:8:256
        temp=img(i:i+7,j:j+7);
        D(m,n)=sum(temp(:));
    n=n+1;
    end
    m=m+1;
    n=1;
end

1 Ответ

1 голос
/ 30 января 2020

Уже есть решение , но мы должны адаптировать его для совместимости с CVX.

squeeze(sum(sum(reshape(X,k,n/k,k,n/k),1),3))

Мне нужно использовать этот код суммирования в инструменте оптимизации , CVX, который не go хорошо со встроенными функциями MATLAB.

к счастью, только некоторые из встроенных функций непригодны для использования, иначе это будет очень сложно. Цитата из справочного руководства :

Ряд базовых и билинейных функций Matlab c либо автоматически работают с выражениями cvx, либо были расширены для этого, в том числе: con, conv, cumsum, diag, точка, найти, fliplr, flipud, flipdim, horzcat, hankel, ipermute, kron, среднее значение, permute, repmat, изменить форму, rot90, sparse, sum, trace, tril, triu, toeplitz, vertcat.

разрешено изменение формы, это означает, что сжатие должно быть заменено. Здесь сжатие используется для преобразования матрицы [1, n / k, 1, n / k] в матрицу [n / kn / k]. Его можно заменить с помощью изменения формы:

n=6
k=2
X=magic(n)
reshape(sum(sum(reshape(X,k,n/k,k,n/k),1),3),n/k,n/k)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...