WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Matrix downsamplen

 

Mischok
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 06.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.06.2012, 20:56     Titel: Matrix downsamplen
  Antworten mit Zitat      
Hi Matlab Gemeinde,

ich bin seit langem stiller leser des Forums und hab bis jetzt auch immer die Antworten aus anderen Threads zusammengekratzt doch leider hab ich jetzt ein kleines Problem bei dem ich nicht wirklich weiter komme.

Es geht um eine Matrix 1024x1024 die ich auf 100x100 runtersamplen will. Ich habe zwar schon einen Ansatz bin jedoch nicht ganz zufrieden damit.

Ich hab es jetzt so probiert, dass meine neue Matrix einfach nur jedes 10. Element in x- und jedes 10. Element in y-Richtung beinhaltet, jedoch ist das natürlich nicht ganz prickelnd, weil ich ja einfach Daten wegfallen lasse...

Ich habe da mehr an eine Möglichkeit gedacht, meine Matrix in Teilmatrizen zu unterteilen und aus dem Mittelwert dieser Matrizen das Element der neuen Matrix zu definieren...

also mein (falscher) Code lautet:

Code:

Data = rand(1024)

Neu = data(1:10:end, 1:10:end);

Neu(101:103,:) = [];
Neu(:,101:103) = [];
 


Dann hab ich durch abschneiden der enden zwar meine 100x100 Matrix aber das stimmt nicht so ganz...

Ich kenne den code "downsample" jedoch funktioniert er bei "double" nicht so ganz.
Was mir vorschwebt ist, dass ich meine Matrix in 10x10 Matrizen unterteile, aus diesen dann den "mean" value bestimmte und diesen dann als Element benutze...

Mit for-Schleifen bin ich nicht ganz so bewandert... Habe zwar einige Versuche gestartet aber hab kläglich versagt, da meine codes keinen Sinn gemacht haben.

Grüße
Mischok
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.06.2012, 21:52     Titel:
  Antworten mit Zitat      
Hallo,

das erste Problem sehe ich darin, dass das hier nicht "aufgeht". Wenn das erstmal gelöst ist:

Ich würde versuchen, die Matrix mit RESHAPE so zu transformieren, dass die Werte, über die der Mittelwert genommen werden soll, immer in einer Spalte stehen.

Alternativ kann man die Matrix mit MAT2CELL in ein Cell Array umwandeln, so dass jede Zelle den Bereich enthält, über den zu mitteln ist. Dann mit CELLFUN elementweise den Mittelwert berechnen und mit CELL2MAT wieder zurückwandeln.

Ein ganz anderer Ansatz wäre, sich mal IMRESIZE (aus Image Processing TB) anzusehen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Mischok
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 06.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.06.2012, 17:47     Titel:
  Antworten mit Zitat      
Hi Harald,

die Idee hatte ich am Anfang auch, doch da bin ich an der "mean" Funktion gescheitert...
Was mir vorgeschwebt hat war ein Code im folgenden Format:

Code:

Data = rand(1024);

Neu = reshape(Data, 1048576, 1);

Data_2 = rand(100);

Neu_2 = reshape(Data_2, 10000, 1);

 


Dann hätte ich praktisch beide Matrizen in Vektorform gebracht. Jetzt fehlt mir aber noch der Teil, wo ich aus der Matrix Neu jeweils über 105 Elemente den "mean" berechne um daras dann EIN Element für die neue Matrix zu machen.
Das eigentliche Problem ist eigentlich, dass ich zwei verschiedene Datensätze habe: Die eine ist auf einer 100x100 Matrix und die andere auf einer 1024x1024 Matrix. Deswegen will ich die letztere auf die 100x100 verkleinern.
Die Funktion interp1 kenne ich auch (um die 100x100 auf 1024x1024) zu bringen. Jedoch komme ich mit der Handhabung der funktion nicht ganz klar.

Grüße
Mischok
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.06.2012, 21:31     Titel:
  Antworten mit Zitat      
Hallo,

wenn mean auf eine Matrix angewendet wird, wird es spaltenweise angewendet. Wie gesagt:
Ich würde versuchen, die Matrix mit RESHAPE so zu transformieren, dass die Werte, über die der Mittelwert genommen werden soll, immer in einer Spalte stehen.
Es müsste also eine Matrix mit 105 (warum auch immer genau 105) Zeilen sein.

Das Problem sehe ich in erster Linie darin, dass eine 1024x1024-Matrix nicht in 105 Zeilen umwandelbar ist.

INTERP1 halte ich hier für wenig zweckmäßig. Ich würde wenn, wie gesagt, IMRESIZE verwenden.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Mischok
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 06.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.06.2012, 21:43     Titel:
  Antworten mit Zitat      
Hi Harald,

ich werde mal deinen IMRESIZE Vorschlag versuchen. Es müsste also möglich sein das Bild einfach per IMRESIZE von 1024x1024 auf 100x100 runter zu skalieren?

Beste Grüße
Mischok
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.06.2012, 23:46     Titel:
  Antworten mit Zitat      
Hallo,

Ja, genau. Einfach mal nen Blick in die Doku werfen Smile
Code:


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Mischok
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 06.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.06.2012, 23:59     Titel:
  Antworten mit Zitat      
Yep hab ich schon... also auf den ersten Blick scheint es genau das zu sein, was ich gesucht habe - aber ich bin immer so ein skeptischer Mensch... ich werd es morgen direkt mal ausprobieren und hier berichten Very Happy

Vielen Dank nochmal für den Hinweis Smile

Grüße
Mischok
Private Nachricht senden Benutzer-Profile anzeigen
 
Mischok
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 06.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.06.2012, 14:15     Titel:
  Antworten mit Zitat      
Hat wuderbar geklappt

Danke Harald Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
D. Grimm

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.05.2013, 17:03     Titel: Lösung ohne Toolbox
  Antworten mit Zitat      
Hallo,
hatte genau das gleiche Thema. Hier der Code fuer einen 3x3 downsampling...

Code:

for m = 1:round(dim_y/3)
   for n = 1:round(dim_x/3)
     new_dz_3x3(m,n) = mean(mean(dz(3*m-2:3*m,3*n-2:3*n)));
   end
end
 


Hierbei ist dz die "grosse" Matrix, new_dz_3x3 die neue "kleine". dim_ sind die urspruenglichen Matrix-Dimensionen...
Gruss, D. Grimm
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 16.05.2013, 09:34     Titel: Re: Lösung ohne Toolbox
  Antworten mit Zitat      
Hallo D. Grimm,

Für große Arrays ist die vektorisierte Fassung nennenswert schneller:
Code:
s = floor(size(x) / 3);  % nicht ROUND!!!
x3 = reshape(x(1:s(1)*3, 1:s(2)*3), 3, s(1), 3, s(2));
x3mean = reshape(sum(sum(x3, 1), 3), s);

(Bitte testen, da ich gerade kein Matlab zur Verfügung habe)
Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.