Angesichts der Matrix:Unter der max von zusammenhängenden Matrix Chunks in MATLAB
a =
1 1 2 2
1 1 2 2
3 3 4 4
3 3 4 4
Ich möchte die folgenden vier 2x2 Matrizen erhalten:
a1 =
1 1
1 1
a2 =
2 2
2 2
a3 =
3 3
3 3
a4 =
4 4
4 4
Von dort aus möchte ich die nehmen max jeder Matrix und dann das Ergebnis in eine Matrix 2x2 Ergebnis umformen, etwa so:
r =
1 2
3 4
die Lage des Ergebnisses max va Lues relativ zu ihrer ursprünglichen Position in der Ausgangsmatrix ist wichtig.
Derzeit bin ich mit dem folgenden Code, dies zu erreichen:
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
Dies funktioniert, aber es scheint, als gäbe es einen Weg geben muss, die nicht Iteration (Vektorisierung) beinhaltet.
ich versuchte, mit neu zu gestalten, wie so: reshape(max(max(reshape(A, w, w, []))), w, w, [])
jedoch, dass der max des falschen Wert und Rückkehr nimmt:
ans =
3 4
3 4
Gibt es eine Möglichkeit, dies ohne Iteration zu erreichen oder sonst mein iteratives Verfahren zu verbessern?
Hier ist eine Methode, die eine Zeile 4-mal langsamer als die Schleife ist: 'Soln = cell2mat (cellfun (@Max, cellfun (@Max, mat2cell (A, [2 2], [2 2]), 'UniformOutput', false), 'UniformOutput', false)); '. Sie haben gefragt, wie man es ohne Iteration macht :-) Aber ich habe es zu einem Kommentar gemacht, nicht zu einer Antwort, weil die Iteration aus der Geschwindigkeitsperspektive wirklich vorzuziehen ist. –
Brauchen Sie die intermediären 2x2 Matrizen für etwas anderes oder interessiert Sie nur die finale Matrix 'r'? –
yep, das war auch mein Gedanke ... – bla