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 aus Schleife erstellen und als .txt exportieren

 

Peedschee
Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 21.10.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 27.01.2014, 06:18     Titel: Matrix aus Schleife erstellen und als .txt exportieren
  Antworten mit Zitat      
Hallo liebe Matlab-Freunde,

ich komme leider an einem Punkt nicht weiter. Und zwar habe ich mehrere Radiobuttons mit denen ich verschiedene Messwertreihen graphisch darstelle. Jeder Klick eines Radiobuttons initiiert auch gleichzeitig eine Berechnung von 3 Kenngrößen, das funktioniert auch wunderbar. Hier der Code:
Code:
% --- Executes when selected object is changed in datasetsbuttongroup2.
function datasetsbuttongroup2_SelectionChangeFcn(hObject, eventdata, handles)
% hObject    handle to the selected object in datasetsbuttongroup2
% eventdata  structure with the following fields (see UIBUTTONGROUP)
%   EventName: string 'SelectionChanged' (read only)
%   OldValue: handle of the previously selected object or empty if none was selected
%   NewValue: handle of the currently selected object
% handles    structure with handles and user data (see GUIDATA)

data = handles.data;
N = get(hObject,'String');
Index = sscanf(N, '%d');

x_deformation = data{Index}(:,1);
y_kraft = data{Index}(:,2);

delta_displacement = diff(x_deformation);
delta_displacement = zeros(size(x_deformation));    % Dimension von delta_displacement anpassen
delta_displacement(1) = x_deformation(2)-x_deformation(1);
delta_displacement(2:end-1) = x_deformation(3:end)-x_deformation(1:end-2);
delta_displacement(end) = x_deformation(end)-x_deformation(end-1);

start_zeile = find(x_deformation == 0); % Startpunkt definieren
stop = find(diff(x_deformation) >= 15); % Endvektor definieren

if isempty (stop) == 1
    cla(handles.berstkurvebisberstpunkt, 'reset');
    cla(handles.berstkurvenormiert, 'reset');
    set(handles.analyzeddatatable,'Data', []);
    set(handles.berstkraft,'String', []);
    set(handles.berstweg,'String', []);
    set(handles.berstarbeit,'String', []);
    errordlg({'Input data cannot be analyzed!',...
        'Check if cell is bursted!'}, 'Error');
    stop_zeile = start_zeile;
else
    if stop(1) > start_zeile;    % Endpunkt definieren
    stop_zeile = stop(1);
else stop_zeile = stop(2);
    end;
end;
   
if isempty (stop) == 0
    Deformation = x_deformation(start_zeile:stop_zeile);
    Kraft = y_kraft(start_zeile:stop_zeile);
   
    Deformation_norm = Deformation ./ max(max(Deformation));    % Normalisieren
    Kraft_norm = Kraft ./ max(max(Kraft));
   
    newdata{Index}(:,1) = Deformation;
    newdata{Index}(:,2) = Kraft;
    newdata{Index}(:,3) = Deformation_norm;
    newdata{Index}(:,4) = Kraft_norm;
   
    if Deformation >= 0 & Kraft >= 0
        Berstkraft = max(Kraft);
        Berstweg = (newdata{Index}(length(Deformation),1));
        Berstarbeit = trapz(Deformation, Kraft) ./ 1000;
        set(handles.berstkraft,'String',Berstkraft);
        set(handles.berstweg,'String',Berstweg);
        set(handles.berstarbeit,'String',Berstarbeit);
       
        wertematrix = [Berstkraft, Berstweg, Berstarbeit];
        set(handles.analyzeddatatable, 'Data', wertematrix);
       
        axes(handles.berstkurvebisberstpunkt);
        scatter(Deformation,Kraft);
        title('Berstkurve bis Berstpunkt');
        xlabel('Deformation [nm]');
        ylabel('Kraft [µN]');
        grid on;

        axes(handles.berstkurvenormiert);
        scatter(Deformation_norm, Kraft_norm, 'g');
        title('Berstkurve normiert');
        xlabel('Deformation normiert [nm]');
        ylabel('Kraft normiert [µN]');
        grid on;
    else
        cla(handles.berstkurvebisberstpunkt, 'reset');
        cla(handles.berstkurvenormiert, 'reset');
        set(handles.analyzeddatatable,'Data', []);
        set(handles.berstkraft,'String', []);
        set(handles.berstweg,'String', []);
        set(handles.berstarbeit,'String', []);
        errordlg({'Input data cannot be analyzed!',...
            'Check if cell is bursted!'}, 'Error');
    end
end;

handles.data = data;
setappdata(0,'Data',newdata);
setappdata(0,'UserData',wertematrix);

guidata(hObject, handles);
 


Diese 3 Kenngrößen speichere ich in der "wertematrix" ab und lasse die Werte in einer Tabelle anzeigen. Jetzt zu meinem Problem: Wie schaffe ich es, dass die Tabelle nicht nur die aktuellen Werte für den geklickten Radiobutton anzeigt sondern dynamisch (d. h. beim Durchklicken der Radiobuttons) Zeile für Zeile erweitert wird?
Und, noch wichtiger: Meine "wertematrix" besteht immer nur aus den aktuellen 3 Werten. Ich möchte mit Betätigung eines Pushbuttons die wertematrix mit allen berechneten Werten von den Radiobuttons, egal ob angeklickt oder nicht, füllen und abspeichern. Bisher habe ich:
Code:
data = handles.data;
newdata = getappdata(0,'Data');
wertematrix= getappdata(0,'UserData');
N = get(hObject,'String');
Index = sscanf(N, '%d');

[filename, pathname] = uiputfile('*.txt');
dlmwrite(fullfile(pathname, filename),wertematrix,'delimiter','\t','precision',6,'roffset',0,'newline','pc');
 


Es wird eine Textdatei geschrieben, aber leider nur mit den 3 Werten für den angeklickten Radiobutton... Auch mit einer for-Schleife werden nur die aktuellen Werte übernommen. Was mache ich falsch?

Ich hoffe ihr könnt mir helfen! Wünsch euch einen schönen Tag!

Grüße,
Peedschee
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: 27.01.2014, 08:59     Titel: Re: Matrix aus Schleife erstellen und als .txt exportieren
  Antworten mit Zitat      
Peedschee hat Folgendes geschrieben:

Diese 3 Kenngrößen speichere ich in der "wertematrix" ab und lasse die Werte in einer Tabelle anzeigen.

Das heißt, derzeit hat deine Tabelle immer nur eine Zeile?

Peedschee hat Folgendes geschrieben:

Jetzt zu meinem Problem: Wie schaffe ich es, dass die Tabelle nicht nur die aktuellen Werte für den geklickten Radiobutton anzeigt sondern dynamisch (d. h. beim Durchklicken der Radiobuttons) Zeile für Zeile erweitert wird?
Und, noch wichtiger: Meine "wertematrix" besteht immer nur aus den aktuellen 3 Werten. Ich möchte mit Betätigung eines Pushbuttons die wertematrix mit allen berechneten Werten von den Radiobuttons, egal ob angeklickt oder nicht, füllen und abspeichern. Bisher habe ich:

Was in deiner Tabelle angezeigt wird, legst du selber fest, über die Datenmenge, die du im uitableaufruf übergibst.
Wenn du nur einen Zeilenvektor übergibst, wird natürlich auch nur eine zeile angezeigt.

Wenn du die vorherigen Werte auch möchtest, musst du diese speichern -> sinniger weise würde ich hier eine Matrix aufstellen, der bei jeder Neuberechnung der Werte einfach eine Zeile angehängt wird.
Diese Matrix übergibst du dann als Daten an uitable.

Bei jedem Radiobuttonklick musst du eben deine Tabelle neu schreiben lassen.

Peedschee hat Folgendes geschrieben:

Es wird eine Textdatei geschrieben, aber leider nur mit den 3 Werten für den angeklickten Radiobutton... Auch mit einer for-Schleife werden nur die aktuellen Werte übernommen. Was mache ich falsch?

Wie oben geschrieben: du merkst dir nur die aktuellen Werte - die vorherigen Werte musst du, z.B. in einer Matrix, auch speichern. und dann die gesamte Matrix schreiben.
_________________

LG
Martina

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 21.10.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 27.01.2014, 19:43     Titel:
  Antworten mit Zitat      
Hi,

danke für deinen Denkanstoß und deine Hilfe!
Ich habe jetzt
Code:
m = [];
       
        new_row = [Berstkraft, Berstweg, Berstarbeit];
        m(Index,:) = [m;new_row];
   
        set(handles.analyzeddatatable,'Data',m);


Es werden jetzt beim Klick der Radiobuttons die richtigen Werte in die richtige Zeile der Matrix/des Tables geschrieben, aber leider werden die vorigen Zeilen dann alle mit 0 0 0 angezeigt. Wie kann ich die Werte speichern, sodass sich die Matrix m mit jedem Radiobutton-Klick um eine Zeile erweitert ohne die vorige auf 0 zu setzen? Sorry, aber ich steh gerade wirklich auf dem Schlauch...

Danke für deine/eure Hilfe!

Gruß,
Peedschee
Private Nachricht senden Benutzer-Profile anzeigen
 
Peedschee
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 21.10.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 28.01.2014, 08:50     Titel:
  Antworten mit Zitat      
Um es noch ein wenig genauer zu formulieren:
Wenn ich auf Radiobutton 1 klicke, erscheinen in meiner Matrix/meiner Tabelle
die berechneten Werte für die 1. Messwertreihe in der 1. Zeile, also z. B.

Code:
1   7   4


Klicke ich dann auf Radiobutton 2, erscheint

Code:

0   0   0
5   2   8
 


in den Zeilen 1 und 2 der Matrix/Tabelle. Haben möchte ich aber
Code:

1   7   4
5   2   8
 


usw. Wie kann ich das in meiner datasetsbuttongroup2_SelectionChangeFcn realisieren?

Ich hoffe wirklich ihr könnt mir helfen! Vielen Dank schon mal für eure Bemühungen!

Grüße
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: 28.01.2014, 13:45     Titel:
  Antworten mit Zitat      
Code:
m = [];
       
        new_row = [Berstkraft, Berstweg, Berstarbeit];
        m(Index,:) = [m;new_row];
   
        set(handles.analyzeddatatable,'Data',m);


Wo setzt du deine Matrix auf []?
Jedesmal bevor du eine neue Zeile besrechnest? Dann ist es nicht verwunderlich, dass nichts weiter drinn steht.

Nur ganz zu beginn - beim Start der Gui, darf die Data-Matrix leer erzeugt werden.

Ansonsten schaue doch bitte mal über Breakpoints selber im Quellcode nach, was wann in m geschrieben wird.
_________________

LG
Martina

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 21.10.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 29.01.2014, 10:57     Titel:
  Antworten mit Zitat      
Hi Mmmartina,

danke für deine Hinweise.
Ich habe
Code:

m = [];
setappdata(0,'UserData',m);
 

jetzt in der Opening Fcn des GUIs preallociert. Ich habe es hinbekommen, dass bei jedem Buttonklick eine neue Zeile in m geschrieben wird, ohne die vorigen Zeilen zu überschreiben oder 0 zu setzen.
Mit
Code:

m = getappdata(0,'UserData');
wertematrix = getappdata(0,'MatrixData');
new_row = [Berstkraft, Berstweg, Berstarbeit];
wertematrix(Index,:) = [m;new_row];
set(handles.analyzeddatatable,'data',wertematrix);

setappdata(0,'Userdata',m);
setappdata(0,'MatrixData',wertematrix);
 

klappt es jetzt wie es soll! Kann man an dem Code noch etwas optimieren?

Viele Grüße und danke nochmal!

Peedschee
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.