Biorąc pod uwagę macierz:Biorąc max sąsiadujących fragmentów macierzy w programie MATLAB
a =
1 1 2 2
1 1 2 2
3 3 4 4
3 3 4 4
Chciałbym uzyskać następujące cztery macierze 2x2:
a1 =
1 1
1 1
a2 =
2 2
2 2
a3 =
3 3
3 3
a4 =
4 4
4 4
Stamtąd chciałbym podjąć max każdej macierzy, a następnie przekształć wynik na macierz wyników 2x2, tak jak:
r =
1 2
3 4
Położenie wyniku max va luki w stosunku do ich pierwotnego położenia w początkowej macierzy są ważne.
Obecnie używam następujący kod do osiągnięcia tego celu:
w = 2
S = zeros(size(A, 1)/w);
for i = 1:size(S)
for j = 1:size(S)
Window = A(i*w-1:i*w, j*w-1:j*w);
S(i, j) = max(max(Window));
end
end
To działa, ale wydaje się, że musi być jakiś sposób, który nie wiąże się z iteracji (wektoryzacji).
Próbowałem za pomocą przekształcenia tak: reshape(max(max(reshape(A, w, w, []))), w, w, [])
jednak, że bierze max niewłaściwych wartości i zwrotów:
ans =
3 4
3 4
Czy istnieje jakiś sposób, aby osiągnąć ten cel bez iteracji lub w inny sposób poprawić swój iteracyjny sposób?
tu jest sposób jeden przewód, który jest 4 razy wolniej niż pętli: 'roztw = cell2mat (cellfun (@max, cellfun (@max, mat2cell (A [2 2] [2 2]), 'UniformOutput', false), 'UniformOutput', false)); '. Poprosiłeś o to, jak to zrobić bez iteracji :-) Ale zrobiłem to jako komentarz, a nie odpowiedź, ponieważ iteracja jest naprawdę lepsza z perspektywy szybkości. –
Czy potrzebujesz pośrednich matryc 2x2 dla czegoś innego, czy tylko interesuje cię ostatnia macierz 'r'? –
Tak, to też była moja myśl ... – bla