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

assignin innerhalb einer Funktion?

 

matlab-frosch
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 07.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.10.2014, 18:34     Titel: assignin innerhalb einer Funktion?
  Antworten mit Zitat      
Hallo zusammen! Dies ist mein erster Forenbeitrag hier und ich bitte darum mir nicht direkt den Kopf abzureißen Wink

Folgendes Problem:

Ich muss CSV-Dateien in Matlab einlesen, was auch alles wunderbar über Code in einem Skript funktioniert. Bis jetzt habe ich das immer mit Variablen im Base-Workspace gemacht.

Nun habe ich die Aufgabe bekommen das "Import"-Skript in eine Funktion zu schreiben damit die ganzen Vorgänge darin getrennt von den Workspaces sind, da eine Fkt ja einen eigenen Workspace hat.

Wichtig ist: Bei den CSV Dateien sind leider fast immer die Überschriften der Messdaten anders. Mal heißt es "Kraft", mal "kraft", mal "N" oder "kN".

Somit hatte ich dies bis jetzt mit einer Schleife gelöst die ggf später den Namen des Messwertvectors einfach ändert - unsauber, aber hat funktioniert.

Das ist der Code wie er bis jetzt als Skript läuft:

Code:


DATEINAME=uigetfile('*.csv');
daten=importdata(DATEINAME,',',1);

colheaders = matlab.lang.makeValidName(daten.colheaders);


    for i = 1:length(colheaders);
    dataByColumn1.(colheaders{i}) = daten.data(:, i);
    end

   
    vars = fieldnames(dataByColumn1);
    for k = 1:length(vars);
    assignin('base', vars{k}, dataByColumn1.(vars{k}));
    end
   

   
exist L_ngen_nderung;
if ans==1;
       weg=L_ngen_nderung;
else
end

exist Kraft;
if ans==1;
       kraft=Kraft;
else
end

wegkraft=[weg,kraft];

 


Was mich stört ist nun beim "Umbau" auf eine Funktion das assignin.

Code:
assignin('base', vars{k}, dataByColumn1.(vars{k}));


Ohne das funktioniert aber das "dynamische" Benennen der Variablen nicht.


Habe jetzt seit 3h rumgesucht (Beschäftige mich erst seit einer Woche mit Matlab) und habe schon die unterschiede der Workspaces (caller, base) und der Funktioninternen verstanden. Auch das Übergeben der Variablen habe ich denke ich verstanden. Aber wie kann ich dieses Variablen aus den Colheaders denn bitte "innerhalb" der Funktion erstellen ohne base Workspace?

Quasi möchte ich am Ende nur eine funktion haben die ich im Skript aufrufen kann (oder im GUI) wo ich mittels uigetfile eine Datei auswählen kann und am ende in mein GUI die beiden Werte für "kraft" und "weg" bekomme. Aber nur diese, nicht die "Zufallsbezeichnungen" die in den jeweiligen CSV stehen.

LG Smile
Private Nachricht senden Benutzer-Profile anzeigen


Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 07.10.2014, 22:37     Titel:
  Antworten mit Zitat      
Hallo,

Ich tu mich immer schwer ohne lauffähiges Beispiel. Kannst du eine Bsp-Datei posten?

Grüße,
Seban
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.10.2014, 22:47     Titel:
  Antworten mit Zitat      
Hallo,

dynamische Variablennamen sind generell keine gute Idee, da die automatische Weiterverarbeitung der Variablen entsprechend schwierig ist - siehe diverse Threads zu eval/evalin/assignin.

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

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 07.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.10.2014, 23:08     Titel:
  Antworten mit Zitat      
Danke für eure Antworten! Anbei das File -> mfile und csv als Bsp

Gut, kann ich sonst vorher die CSV files über ein skript jagen was mir die benennung korrekt macht? ich darf nicht vom user verlangen auf die syntax zu achten, das ist das problem.


Liebe Grüße Smile

code.zip
 Beschreibung:

Download
 Dateiname:  code.zip
 Dateigröße:  46.19 KB
 Heruntergeladen:  307 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 07.10.2014, 23:39     Titel:
  Antworten mit Zitat      
Unterscheiden sich die csv-Dateien nur in der Bezeichnung der Header oder auch in der Reihenfolge der Daten (spaltenweise)?

Ich verstehe nicht, wieso du die Existenz von L_ngen_nderung und Kraft überprüfst, wenn diese Bezeichnungen doch von csv zu csv unterschiedlich sind.
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
matlab-frosch
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 07.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.10.2014, 23:51     Titel:
  Antworten mit Zitat      
Hey!

Sowohl die Reihenfolge der Spalten als auch die Beschriftung ist unterschiedlich.

In dem Beispiel habe ich L_ngen_nderung nur als Beispiel gezeigt. Ich "müsste"

* Längenänderung
* weg
* Weg
* mm
* µm
* m

Abfragen. Je nach Messgerät werden andere Achsenbeschriftungen in der CSV ausgegeben. Dies kann ich nicht beinflussen und später kann nicht bei 100. von Dateien immer alles von Hand angepasst werden.
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 08.10.2014, 00:58     Titel:
  Antworten mit Zitat      
Ok, dann ist das Problem "bloß" wie man die die richtige Spalte aus dem Dokument der richtigen Variable zuordnet. Da die möglichen Namen bekannt zu sein scheinen, kann man diese mit strcmp prüfen und die Daten entsprechend zuweisen.

Die ausgelagerte Funktion zum Einlesen der csv könnte etwa so aussehen:
Code:
function [weg, kraft] = importCSV

DATEINAME   = uigetfile('*.csv');
daten       = importdata(DATEINAME,',',1);

colheaders          = matlab.lang.makeValidName(daten.colheaders);
pssbl_names_weg     = {'L_ngen_nderung'; 'weg'; 'Weg'};
pssbl_names_kraft   = {'Kraft'; 'power'; 'F'};

for ii = 1:size(colheaders, 2)
   
    log_weg = strcmp(colheaders(ii), pssbl_names_weg);
    if find(log_weg)
        idx_weg = ii;
        continue;
    end
   
    log_kraft = strcmp(colheaders(ii), pssbl_names_kraft);
    if find(log_kraft)
        idx_kraft = ii;
        continue;
    end
end

weg     = daten.data(:, idx_weg);
kraft   = daten.data(:, idx_kraft);

Diese in ein m-File namens importCSV.m speichern.

In der aufrufenden Funktion (oder zum testen im Command Window) kannst du die Funktion bspw. mittels
[d, f] = importCSV
aufrufen, dann werden dir von der Funktion importCSV die Variable weg in d und kraft in f zurückgegeben (diese befinden sich dann im Workspace der aufrufenden Funktion). d und f kannst du auch einfach weg und kraft nennen, möchte bloß verdeutlichen, dass die nicht den gleichen Bezeichner haben müssen.

Grüße,
Seban
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
matlab-frosch
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 07.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.10.2014, 01:05     Titel:
  Antworten mit Zitat      
WOW!

Danke! Das funktioniert genau wie ich mir das gedacht habe Smile Tolles Forum!!!
Ich schreibe die nächsten zwei Monate an meiner Bachelorarbeit Wink Werde wohl noch öfters herkommen =)

hat jemand von euch einen Rat welche Literatur für einen Einstieg empfehlenswert ist? Außer natürlich die Hilfe von Matlab selber Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 08.10.2014, 01:47     Titel:
  Antworten mit Zitat      
Gern geschehen.

Ich hab mit Einstieg in das Programmieren mit MATLAB von Stein angefangen in Matlab zu programmieren, fand ich auch sehr hilfreich. Vergleichsmöglichkeiten hab ich jedoch kaum, bloß Matlab & Simulink: Grundlegende Einführung von Beucher hatte ich vorher(?) begonnen. Das fand ich aber nicht so gut und hab's irgendwann gut sein lassen. Lag aber vllt auch daran, dass ich durch meinen Hiwi-Job schnell Fortschritte gemacht habe, die das Buch entbehrlich gemacht haben. Ein Kollege von mir fand es ok iirc.

Welches Buch dir am besten hilft, hängt aber auch vom Anwendungsgebiet ab, gibt ja zig Theman und dementsprechend viele Bücher. Ich hab mir damals mehrere in der Bib ausgeliehen und dann obige beiden ausgewählt.
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
matlab-frosch
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 07.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.01.2015, 17:25     Titel:
  Antworten mit Zitat      
Hallo Smile Ich bin es wieder. Bachelorarbeit ist durch und alles lief super. Jetzt will ich mein Programm aber noch verbessern.

Wie kann ich bei

importdata(DATEINAME,',',1)

das Trennzeichen als Komma und als Semikolon angeben? Ich finde nirgendwo einen Hinweis wie ich multiple Trennzeichen angeben kann.

Liebe Grüße und vielen Dank Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 10.01.2015, 04:48     Titel:
  Antworten mit Zitat      
Hallo,
matlab-frosch hat Folgendes geschrieben:
Bachelorarbeit ist durch und alles lief super.

Grats =)

matlab-frosch hat Folgendes geschrieben:
Wie kann ich bei

importdata(DATEINAME,',',1)

das Trennzeichen als Komma und als Semikolon angeben? Ich finde nirgendwo einen Hinweis wie ich multiple Trennzeichen angeben kann.

Weiß ich leider auch nicht. Vielleicht wirst du hier bei einer anderen Funktion fündig.

Als Workaround könnte man einfach die Zeichen mit einem Texteditor mit der 'Ersetzen'-Funktion anpassen. Mit Notepad++ bspw. kann man über Strg-h alle Vorkommnisse des Zeichens auf einmal ersetzen.

Grüße,
Seban
_________________

Richtig fragen
Debugging
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.