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

Abschnitt von einem Vektor verwenden

 

FReef
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 11.10.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.10.2021, 15:42     Titel: Abschnitt von einem Vektor verwenden
  Antworten mit Zitat      
Hallo zusammen,

ich habe eine Tabelle mit 3 Spalten und n Zeilen.
1. Spalte: time
2. Spalte: x-Wert
3. Spalte: y-Wert

Ich möchte jetzt einen Startzeitpunkt auswählen, also tStart = 2 beispielsweise (manuelle Eingabe im Programm).
Ab diesem Wert t(n) >= tStart möchte ich die x- und y-Werte, also x(n) und y(n), auslesen und alle vorherigen ignorieren bis zu einem Endzeitpunkt t(n) <= tEnd.

Danach möchte ich die Punkte aus dem Abschnitt mit den x und y-Werten mit scatter plotten.

Wie mache ich das am besten?
if- oder for-Schleife?

Vielen Dank für eure Hilfe.

BSP_Liste.PNG
 Beschreibung:
Die Liste dient als kleines Beispiel ;)

Download
 Dateiname:  BSP_Liste.PNG
 Dateigröße:  17.6 KB
 Heruntergeladen:  184 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.10.2021, 16:00     Titel:
  Antworten mit Zitat      
Hallo,

generell ist es leichter, wenn du die Datei als solche anhängst statt einen Screenshot davon. Dann kann man Vorschläge direkt ausprobieren.
Eine Schleife sollte jedenfalls nicht nötig sein, stattdessen kann man logische Indizierung verwenden.

Code:
data = readtable("file.xlsx");
selected = data.time >= tStart & data.time <= tEnd;
scatter(data.x(selected), data.y(selected));


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
FReef
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 11.10.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.10.2021, 16:28     Titel:
  Antworten mit Zitat      
Vielen Dank für die super schnelle Antwort Harald.

Bei mir handelt es sich eigentlich um eine sehr große .csv-Datei.
Diese ist noch nicht schön unterteilt in die Werte, die ich benötige (time, x, y).
time steht in der ersten Spalte, aber in der zweiten Spalte steht ein Vektor mit (x,y,z).

Daher habe ich erst aus der .csv-Datei eine .mat-Datei erzeugt.
Daraus kann ich dann die Werte besser auslesen (komischer Zwischenschritt vermutlich).
Ich habe mal sowohl die ursprüngliche .csv-Datei, als auch einen Ausschnitt aus der erzeugten .mat-Datei angehängt zur Klärung.

Anscheinend kann ich die -mat-Datei nicht so einfach mit data einlesen, richtig?

Was habe ich stattdessen für Möglichkeiten?

Main.mat
 Beschreibung:
Ausschnitt aus der erzeugten Main.mat-Datei

Download
 Dateiname:  Main.mat
 Dateigröße:  114.01 KB
 Heruntergeladen:  198 mal
Main_csv.zip
 Beschreibung:
main.csv-Datei im Zip-Ordner

Download
 Dateiname:  Main_csv.zip
 Dateigröße:  97.61 KB
 Heruntergeladen:  205 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.10.2021, 16:58     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Daher habe ich erst aus der .csv-Datei eine .mat-Datei erzeugt.

Wie hast du das denn gemacht? In der Regel wird dazu die Datei dann auch in MATLAB importiert.

Die .mat-Datei kannst du mit load importieren. Die darin enthaltene Variable heißt Main, und so musst du dann auch damit arbeiten.
Code:
load Main
tStart = 2; tEnd = 10;
selected = Main.time >= tStart & Main.time <= tEnd;
scatter(Main.x(selected), Main.y(selected));


Die x-Werte sind teils komplex und z.B. in Zeilen 70 und 71 mit unendlichem Imaginärteil. Soll das so sein?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
FReef
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 11.10.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.10.2021, 21:56     Titel:
  Antworten mit Zitat      
So sieht mein Codeabschnitt zum Import der main.csv aus.
Ich muss die Daten mehrfach trennen (delimiter) und doubles aus den Einträgen machen, um diese zu verwenden.
Ich habe keine schönere Möglichkeit gefunden bisher. Es funktioniert aber Very Happy

Code:

%% INITIALIZE MATLAB
close all;
clc;
clear all;

%% Input time section
tStart = 50.432;     % manually input
tEnd = 150.48;     % manually input

%% Import CSV
Import = readtable('main.csv', 'delimiter', {'|', ',','('},'VariableNamingRule','modify');
data = Import(1:end , 1:5);
data.Properties.VariableNames = {'time', 'empty','xOrg', 'yOrg','zOrg'};  %name the columns of the table

%% Make doubles out of table
time = data(:,1);
XOrg   = data(:,3);
YOrg   = data(:,4);

nums = [XOrg{:,1}];
x = nums(:,1);

nums = [YOrg{:,1}];
y = nums(:,1);

nums = [time{:,1}];
t = nums(:,1);

%% Zeit Unterteilung

% selected = data.time >= tStart & data.time <= tEnd;   %if x- and y- would be doubles in data
% scatter(data.x(selected), data.y(selected));          %if x- and y- would be doubles in data

selected = t >= tStart & t <= tEnd;
scatter(x(selected), y(selected));

 


Anschließend verwende ich kein scatter sondern füge ein Hintergrundbild in Graustufen ein und plotte eine Art heatmap mit scatplot über das Bild.
Leider sind die Einträge dann an der y-Achse umgekehrt und ich bekomme die Punkte nicht transparent. Das ist aber ein neues Problem...

Code:

%% Background Image gray
rgbImage = imread('Hintergrund.png');
imshow(rgbImage);
gray = rgb2gray(rgbImage);
imshow(gray);
hold on;

%% Scatplot over background
radius = 0.4*sqrt((range(x)/30)^2 + (range(y)/30)^2);
scatplot(x(selected), y(selected),'circle',radius,100,5,3,5);

xlabel('x value')
ylabel('y value')
 
Private Nachricht senden Benutzer-Profile anzeigen
 
FReef
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 11.10.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.10.2021, 21:58     Titel:
  Antworten mit Zitat      
Zitat:

Die x-Werte sind teils komplex und z.B. in Zeilen 70 und 71 mit unendlichem Imaginärteil. Soll das so sein?


Daran kann ich leider nichts ändern. Ich mache aus den Werten Realteile mit real() und die unendlichen Werte würde ich am liebsten streichen bzw. nicht abbilden lassen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Leider sind die Einträge dann an der y-Achse umgekehrt und ich bekomme die Punkte nicht transparent. Das ist aber ein neues Problem...


Für die y-Achse sollte das helfen:
Code:
ax = gca;
ax.YDir = "normal";

Eventuell musst du dann auch das Bild spiegeln, z.B. mit flipud.

Für Transparenz müsstest du dir ansehen, wie dieses scatplot arbeitet. Normalerweise geht das über die Eigenschaft FaceAlpha.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
aemon
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 26.10.17
Wohnort: Niedersachsen
Version: R2019a / R2021a
     Beitrag Verfasst am: 12.10.2021, 15:21     Titel:
  Antworten mit Zitat      
bzw. evtl auch umdrehen mit
Code:
ax.YDir = 'reverse';


Meist nutzt man dafür die Befehle
Code:
axis ij % bzw. axis(ax,'ij'): entspricht 'reverse'
axis xy % entspricht 'normal'
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.