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 teilen?

 

sirpaderick
Forum-Anfänger

Forum-Anfänger



Beiträge: 14
Anmeldedatum: 18.06.08
Wohnort: Ludwigshafen
Version: 7.5.0 (R2007b)
     Beitrag Verfasst am: 19.06.2008, 03:36     Titel: Matrix teilen?
  Antworten mit Zitat      
Hallo,

ich bin absoluter Matlab Neuling und soll ein kleines Programm schreiben.
Problemstellung ist: Matrix 28x28. Zur weiteren Bearbeitung müsste ich diese in 14x14 =196 Matrizen zerlegen, d.h. immer 2pro Reihe und Spalte sollten zusammengefasst werden.
hier mal ein Beispiel wie ich das meine

% Ausgangsmatrix ist 5x5 und wird um jeweils eine Zeile und Spalte gekürzt
a=xlsread('Mappe1.xlsx');
b=a(1:4,2:5);

c=b(1:2,1:2);
d=b(1:2,3:4);

Dieser Code funktioniert zwar, ist aber bei 196 Matrixen recht aufwändig und umständlich. Gibt es da irgendeine schnellere Lösung mit irgendwelchen Schleifen?

Viele Dank für eure Hilfe Very Happy
Private Nachricht senden Benutzer-Profile anzeigen


Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 19.06.2008, 20:28     Titel:
  Antworten mit Zitat      
Hallo sirpaderick,

wenn Du folgendes eingibst

Code:


kannst Du mit

Code:
B(:,:,ind)


für ind zwischen 1 und 196 die verschiedenen Matrizen abgreifen. Zuerst werden die ersten beiden Spalten von A von oben nach unten abgearbeitet, dann die nächsten beiden Spalten usw.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
sirpaderick
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 14
Anmeldedatum: 18.06.08
Wohnort: Ludwigshafen
Version: 7.5.0 (R2007b)
     Beitrag Verfasst am: 20.06.2008, 01:31     Titel:
  Antworten mit Zitat      
Very Happy Danke für deine Antwort.
Habe den Befehl natürlich ausprobiert und er läuft. Er erstellt mir auch wie erwünscht 196 Matrizen, aber nicht so wie ich sie bräuchte.

So wie du mir das geschrieben hattest, arbeitet Matlab einfach jede Spalte von oben nach unten ab und fast immer 4 zu einer Matrix zusammen.
Die Matrizen die ich bräuchte müssten aber aus:

Reihe 1 --> 1.+2. Element und
Reihe 2 --> 1.+2. Element bestehen.

danach dann Reihe 1--> 3.+4. und Reihe 2 --> 3.+4.
genau so dann auch für die Reihen 3 bis 28

Hoffe du verstehst was ich meine. Und über die Antwort habe ich mich auch gefreut und gleich eifrig rumgebastelt.

Danke schonmal
Private Nachricht senden Benutzer-Profile anzeigen
 
keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 20.06.2008, 08:42     Titel:
  Antworten mit Zitat      
Ist folgendes in etwa, wie Du meinst?

Code:
for k = 1 : 14
for j = 1 : 14
C(:,:,(j-1)*14+k) = A(2*j-1:2*j,2*k-1:2*k);
end
end
Private Nachricht senden Benutzer-Profile anzeigen
 
sirpaderick
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 14
Anmeldedatum: 18.06.08
Wohnort: Ludwigshafen
Version: 7.5.0 (R2007b)
     Beitrag Verfasst am: 20.06.2008, 14:47     Titel:
  Antworten mit Zitat      
Hey danke,

heute Morgen hatte ich kurz reingeschaut und da er mir das C rot unterstrichen anzeigt, dachte ich es funktioniert nicht. Daher hatte ich etwas veraendert das nicht lief.
Eben habe ich es mal so eingegeben wie du es gepostet hast und es laeuft.
Um kurz hinter die Mathematik zu steigen... du hast Matlab damit gesagt, das es so etwas wie eine Reihe erzeugen soll. du sagst:

2*j-1:2*j --> also fuer 1 =1 und 2
und fuer 2 =3 und 4

aber was hast du mit der neuen Matrix gemacht?
C(:,:,(j-1)*14+k)


Danke auf jeden Fall mal dafuer Very Happy

ok ok...habe mich eben mal in ner ruhigen Minute dait auseinander gesetzt. Wie gesagt bin Matlab Anfaenger und muss Sachen verstehen bevor ich sie mir effektiv merken kann. Wieso kann Matlab fuer deinen Befehl der von 1 bis 196 geht, 196 Matrixen erzeugen und wenn ich eingebe C(:,:,j*k) nicht? Es erzeugt zwar 196 Matrixen aber alle bis auf die letzte sind leer?
Falls jemand mir das erklaeren kann waere ich sehr dankbar, weil ich denke das es ein grundlegendes Verstaendnisproblem ist
Private Nachricht senden Benutzer-Profile anzeigen
 
keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 20.06.2008, 17:27     Titel:
  Antworten mit Zitat      
Hm, kannst Du Deinen Code mal hier rein posten, dann waere es um ein Vielfaches leichter, ihn zu kommentieren :)

j*k als Index ist aber sowieso nicht zielfuehrend, aus einem einfachen Grund:
j*k und k*j sind das gleiche. Wenn Du beispielsweise aus den Zeilen 7 und 8 (j = 4) die Spalten 3 und 4 (k = 2) extrahieren willst, beschreibst Du die selben Elemente von C wie wenn Du die Zeilen 3 und 4 (j = 2) und die Spalten 7 und 8 (k = 4) extrahierst. Dadurch ueberschreibst Du einerseits bereits vorhandene Werte, andererseits befuellst Du nicht alle Elemente von C.

Meine bisher einzige Idee, wieso nur die j*k-te Untermatrix befuellt wird, waere, dass Du in Deiner Schleife C jedes Mal neu mit Nullen initialisierst.

Sorry, dass ich die mathematischen Fachbegriffe nicht drauf hab, ist leider schon ein paar Jahre her :D
Private Nachricht senden Benutzer-Profile anzeigen
 
sirpaderick
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 14
Anmeldedatum: 18.06.08
Wohnort: Ludwigshafen
Version: 7.5.0 (R2007b)
     Beitrag Verfasst am: 20.06.2008, 19:37     Titel:
  Antworten mit Zitat      
Ja klar poste ich dir den Text. Hast mir auch sehr geholfen bisher

Code:

%% Text for transforming the 29x29 pressure data into a 14x14 Matrix
Close all;
clear all;
clc;

inputfile='SS_LNN_1_4_70psi_10s_3mm_29x29';
increment=0.35; %mm
m=29;                               %steps of the square x & y
n=29;

P_temp = csvread(strcat(inputfile,'.txt'));

Pmax = 20;          % range of pressure sensor in inches of H2O
zpv = 0.253;        % zero pressuree voltage
Vspan = 4;          % voltage range of transducer

% the first data point in the Pressure file is ignored because it's in the center and not at the origin
P_raw = P_temp(2:length(P_temp));

% reshape  the pressure data
P_raw = reshape(P_raw,m,n);

% Calculate the pressure
p_inH2O = Pmax*(P_raw-zpv)/Vspan;
p_Pa = 248.845 * p_inH2O;

p_Pa_rot90 = rot90(p_Pa);
p_Pa_fliprot90 = flipud(p_Pa_rot90);

%% Transformation
B=p_Pa_fliprot90(1:28,2:29);
%  B=magic(2Cool
for k = 1 : 14
for j = 1 : 14
C(:,:,(j-1)*14+k) = B(2*j-1:2*j,2*k-1:2*k);
end
end
   
for h=1:196;
    D(:,:,h)=(C(1,1,h)+C(1,2,h)+C(2,1,h)+C(2,2,h))/4;
end


Ziel ist es jetzt aus diesen neugeschaffenen Matrizen wieder eine zu machen. Grund fuer die ganze Arbeit war, das wir verschiedene Datensaetze haben die von der Groesse her anneinander angepasst werden mussten/muessen
Wenn du den Code benutzen moechtest, dann nehme anstatt der Matrix B gerade magic(2Cool

Vielen Dank Patrick
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 - 2024 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.