Я пытаюсь написать «взвешенное движущееся окно» без вложенных циклов для улучшения скорости.Я уже пытался использовать arrayfun без получения впечатляющих результатов, но, возможно, я сделал это неправильно.
Окно имеет различный вес в каждой позиции (хранится в B) и должно быть наложено на матрицу A, возвращающуюзначения матрицы A, которые лежат внутри окна, умножают вес окна в этой позиции (считайте из B).Кроме того, окна могут перекрывать одно на другое, и в этом случае максимальное значение должно быть сохранено.Наконец, размер и смещение окна должны быть параметрами функции.
На самом деле это выглядит сложнее, поэтому я покажу вам код, который я хотел бы улучшить:
A = reshape([1:35],7,5)'; % values matrix
B = [1:3;4:6]; % window s weight matrix
% matrices size
[m n] = size(A);
[a b] = size(B);
% window s parameters
shift = 2; % window s movement at each iteration
zone = 3; % window s size (zone x zone)
% preallocation
C = ones(m,n); % to store the right weight to be applied in each position
% loop through positions and find the best weight when they overlap
for i=1:m
for j=1:n
C(i,j) = max(max(B( max(round((i-zone)/shift)+1,1) : min(ceil(i/shift),a) , max(round((j-zone)/shift)+1,1) : min(ceil(j/shift),b))));
end
end
% find the output of the windows
result = C.*A;
Iнадеюсь, что я дал понять, но если вам нужно больше деталей, пожалуйста, спросите.Заранее благодарю за помощь!