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

Werte eines Vektors einer Matrix kürzen ( runden )

 

DerPadde
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 02.06.14
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 02.06.2014, 15:02     Titel: Werte eines Vektors einer Matrix kürzen ( runden )
  Antworten mit Zitat      
Hallo Community,
dies ist mein erster Beitrag.
Ich möchte aus einer Excel Tabelle zwei Spalten importieren.
Die erste Spalte beinhaltet Zeitwerte von t=0 bis t = x und die zweite Spalte Geschwindigkeitswerte.

Nun importiere ich mit Hilfe des Wizzard's die ersten beiden Spalten und erhalte in Matlab eine Tabelle (Matrix).
Die erste Spalte enthält integer Werte, also t = 0 ... x [s] die zweite enthält Geschwindigkeiten als Dezimalwerte.
Also bsp.:

Code:

A(1,:)

ans =

    1.0000    5.8990
%schon hier komisch, dass er in der matlab ausgabe beide werte dezimal anzeigt und, wohingegen er beim doppelklick auf die importierten werte eine tabelle mit erster spalte int werten und zweiter spalte deziamal anzeigt (wie es sein sollte)

 


Ich habe erst den zweiten Vektor gespeichert, dann diesen gekürzt und zum schluss eine neue matrix gebildet.
Nun Möchte ich die Werte des Geschwindigkeitsvektors verschieden kürzen. Einmal mit drei nachkommastellen, dann mit nur zweien und dann mit einer nachkommastelle.

Mein Vorgehen:

Code:

%Vektor der Matrix einzeln speichern
% A = Matrix [ t in s , Geschw in km/h]

Svec_A = A(:,2);

%Werte Kürzen auf drei Dezimalstellen

Svec_3dez = round(Svec_A*1000)/1000;

%Gekürzte Werte der Geschw samt Zeit in eine neue Matrix:

 A_3dez = [A(:,1) Svec_3dez];

%Ausgabe von Matlab:
t          |    v
1.8086 |    0.0002

%Doppelklick im Workspace auf A_3dez:
t | v
18086   1,74300000000000

 


Wie bekomm ich das geschmeidiger hin ?
Ich habe mehrere Exceltabellen bzw. matrizen, die ich auf diese art kürzen (ab 5 aufrunden bis 4 abrunden) möchte. Und anschließend darstellen und auswerten..
Es ist auch das Problem, dass die ganzen nachkommastellen nicht abgeschnitten werden nach der dritten stelle beispielsweise.
Ich weiß, dass Matlab bzw. Matheprogramme an sich mit Binärsystemen arbeiten, aber mit dem kürzen bin ich noch nicht ganz durchgestiegen...
Grüße

Patrick
Private Nachricht senden Benutzer-Profile anzeigen


Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 03.06.2014, 13:00     Titel:
  Antworten mit Zitat      
Das Runden, welches du durchführst, paßt so, wie es ist.
Das was dich stört ist die matlabinterne Zahlendarstellung. Je nach genutztem Format wird die Zahl rechts nach dem Komma mit Nullen aufgefüllt.
Da ändert aber nichts am Wert der Ziffer. 1 == 1.00 == 1.000000000000

Warum genau stören die die Nullen?
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
DerPadde
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 02.06.14
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 09.06.2014, 10:31     Titel:
  Antworten mit Zitat      
Hi Martina,

habe seit dem letzten mal ein wenig weiter gearbeitet.

Möchte nun die Matrix abspeichern und dafür den Dateinamen 'tabelle_stadt_3nk' rausbekommen.
Also function runden verlangt eine Tabelle und ein Tabellenblatt, danach soll er den Dateinamen wählen und je nach dem wert 'nk' abspeichern.
Der Code sieht so aus:
Code:

function runden(nk,tabelle,stadt)

speedvec = xlsread(tabelle,stadt);
    switch nk
        case 3
        z = 1000;
        case 2
        z = 100;
        case 1
        z = 10;
        otherwise
        warning('Bitte Anzahl Nachkommastellen angeben von 1 bis 3');
    end  
second = speedvec(:,2);
rounds = round(second*z)/z;
first = speedvec(:,1);
Gerundet = [first rounds];
    switch nk
        case 3
        save(tabelle'_3nk');
        case 2
        save(tabelle'_2nk');
        case 1
        save(tabelle'_1nk');
        otherwise
        warning('Bitte Anzahl Nachkommastellen angeben von 1 bis 3');
    end  
disp(Gerundet)
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 09.06.2014, 20:59     Titel:
  Antworten mit Zitat      
Hallo DerPadde,

Welche Probleme hast Du denn jetzt mit dem geposteten Code?

Ein Vorschlag:
Code:
function runden(nk,tabelle,stadt)

speedvec = xlsread(tabelle,stadt);
    switch nk
        case 3
          z = 1000;
        case 2
          z = 100;
        case 1
          z = 10;
        otherwise
          % Bei Fehleingaben ist ein ERROR viel besser als eine WARNING!
          error('Bitte Anzahl Nachkommastellen angeben von 1 bis 3');
    end  
second = speedvec(:,2);
rounds = round(second*z)/z;
first = speedvec(:,1);
Gerundet = [first rounds];
save(sprintf('tabelle_%dnk', nk), 'rounds');  % Oder welche Variable Du speichern möchtest
disp(Gerundet)
end

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
DerPadde
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 02.06.14
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 10.06.2014, 10:13     Titel:
  Antworten mit Zitat      
Hi,
danke für die Tipps
Bin jetzt soweit, dass die Messwerte eingelesen, geplottet und gespeichert werden.
Nun macht mir der 'diff-Befehl' Probleme, da der erste Wert des Ausgangsvektors logischerweise nicht abgeleitet werden kann.
Also Matlab schneidet einfach den ersten wert "0" ab.
Von mir aus setze ich den ersten wert des abgeleiteten Vektors manuell gleich null, nur wie ?
hab schon ein paar Anläufe mit if und switch Verschachtelungen durch aber keinen Erfolg bist jetzt.
Es geht um einen Beschleunigungsvektor, der anhand des Geschwindigkeitsvektors die Beschleunigung zu der gemessenen zeit ermittelt. Nach der Ableitung füge ich den Zeitvektor mit dem Beschleunigungsvektor wieder zu einer Matrix zusammen.

Code:

second = "1xn" Vektor
length(second) = 100
beschlvektor = diff(second);
length(beschlvektor) = 99
 


Hab es unschön gelöst

Code:

beschlvektor(1) = 0;
beschlvektor(2:length(second)) = diff(second);
disp(length(beschlvektor))
 
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.