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

Auslesen von xlsx-Tabellen mit leeren Zellen

 

Henrik123
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 13.04.2017, 15:09     Titel: Auslesen von xlsx-Tabellen mit leeren Zellen
  Antworten mit Zitat      
Hallo liebe Gemeinde. Ich möchte folgendes Problem lösen. In meinem Exceldokument befinden sich elf Spalten mit 18 Zeilen. Die Daten entsprechen X und Y-Werten die ich später plotten möchte in einem Bild.

Mein Problem ist, dass eine Spalte zwar 18 Zeilen lang ist aber nur 14 zusammenhängenden Zellen Werte enthält. Die restlichen Zellen sind leer. Das Programm was ich geschrieben habe, scheint mit leeren Zellen nicht klar zu kommen. Kann mir da wer helfen?

Außerdem habe ich eine ähnliche Messung mit einer Tabelle aus 36 Zeilen und 11 Spalten. Dort befinden sich ebenfalls zusammehängende Zeilen innerhalb einer Spalte bei unterschiedlichen Startpositionen. Die Werte möchte ich auch in einem Bild darstellen.

Das strrep könnte ich mir eigentlich sparen, da mein Excel-Dokument ja das richtige Format ausgibt. RIchtig?

Ich habe die beiden Tabellen mal im Anhang beigefügt.

Code:

clear all;
Folder = 'xxx';                

% ---Structure of the raw data--- %
nHead = 2;  % define headerlines
nData = 18;  % define datalines
Block = 1; % define amount of measurements per txt-file
nValues = 11;  % define columns with important data

% ---Script for reading and writing the data--- %
FileName = [Folder 'Auswertung.xlsx'];
fid = fopen(FileName, 'r');
if fid == -1
    error('Cannot open file %s', FileName);
end
Result = zeros(nData, nValues); % Matrix of the import data
Output = zeros(nfreq,Block*2); % Matrix dimension of output data
   
% ---Import data--- %        
        for iHead = 1:nHead;
            fgetl(fid);  % Ignore header lines
        end

        for iData = 1:nData  % Write raw data
            S = fgetl(fid);
            S = strrep(S, ',', '.');
            Value = sscanf(S, '%g', [1, nValues]); % Reading the entries in the line of the amount of nValues
            Result(iData,:) = Value;                  
        end
fclose(fid);


Tabelle2.PNG
 Beschreibung:

Download
 Dateiname:  Tabelle2.PNG
 Dateigröße:  42.54 KB
 Heruntergeladen:  287 mal
Tabelle1.PNG
 Beschreibung:

Download
 Dateiname:  Tabelle1.PNG
 Dateigröße:  32.13 KB
 Heruntergeladen:  294 mal
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 16.04.2017, 15:05     Titel:
  Antworten mit Zitat      
Hallo, warum nutzt du eigentlich keine XLSREAD-Funktion, um Excel-Tabellen einzulesen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Henrik123
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 19.04.2017, 09:22     Titel:
  Antworten mit Zitat      
Danke für die Antwort. Das ist ganz einfach. Weil ich die Datei als txt bekomme und in Excel bearbeite, weil ich es in Matlab (noch) nicht hinbekomme. xD

Es wäre von daher klasse, wenn ich es in der txt bearbeiten könnte. Ich habe meine Frage also etwas unpräzise gestellt.

Ich denke, das Problem lässt sich beheben, wenn das kleine Programm die Tabelle Spaltenweise ausließt. Aktuelle liest es ja zeilenweise. Hat da jemand einen schnellen Ansatz?

Besten Gruß
Henrik123
Private Nachricht senden Benutzer-Profile anzeigen
 
Henrik123
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 20.04.2017, 13:43     Titel:
  Antworten mit Zitat      
Ich habe jetzt follgendes Versucht.

Code:

clear all;
close all;


%---Folder which includes the measured data---%
Folder = xxx              

%---Script for reading and writing the data---%
FileName = [Folder 'Grobauswertung.xlsx'];
fid = fopen(FileName, 'r');
if fid == -1
    error('Cannot open file %s', FileName);
end
Result = xlsread(FileName); %Matrix of the imported data

fclose(fid);
 


Das funktioniert soweit, dass ich meine Werte bekomme. Allerdings steht in einigen Matrixelementen NaN. Dort habe ich keine Werte.

Jetzt will ich aber mit einer for-Schleife meine parameter fitten. Matlab scheint nicht mit NaN rechnen zu können.

Für das fitten verwende ich die optimaization toolbox.


Code:

%---Create the fitting curves---%

n=(length(Result(1,:))-1)/2     %Amount of fitting curves

rng(0,'twister');
xdata = 0:0.5:5000;     %Steps for the fitting curve, resolution
xdata = xdata';         %Transpose for matching the matrixdimension
tdata = Result(:,1);    %Declaration of measured x-values

for i=1:n

    ydata = Result(:,2*i);              %Declaration of every second column of y-values
    fun = @(x)sseval(x,tdata,ydata);    %Point to the specific plotfunction

    c = 3       %Amount of coefficients
        %A      =    %bestx(1)
        %omega  =    %bestx(2)
        %D      =    %bestx(3)
    x0=zeros(c,1);
    x0(1,1) = 2%(100-10).*rand(1,1) + 10;      %Random start parameter for coefficients
    x0(2,1) = 700%(1600-600).*rand(1,1) + 600;
    x0(3,1) = 2%(20-0.001).*rand(1,1) + 0.001;

%Calculating fitting parameters
    bestx = fminsearch(fun,x0)      %Searching for the least uncertainty of c
    yfit = bestx(1)./(sqrt((1-(xdata/bestx(2)).^2).^2+(2*bestx(3)*xdata/bestx(2)).^2));     %Forced oscillation fit

%---Plot data---%
hold all

plot(Result(:,1),Result(:,2*i), '*', 'LineWidth',1)
plot(xdata,yfit,'r');
xlim([0 1500])
ylim([0 8])
xlabel('tdata')
ylabel('Response Data and Curve')
title('Data and Best Fitting Exponential Curve')
legend('Data','Fitted Curve')

end


Die Fitfunktion sieht wie folgt aus. Hier werden die Fehlerquadrate minimiert.

function sse = sseval(x,tdata,ydata)
A = x(1);
omega = x(2);
D = x(3);
sse = sum((ydata - A./(sqrt((1-(tdata/omega).^2).^2+4*D.^2*(tdata/omega).^2))).^2);


In spalten der Grobauswertung und den Spalten der Feinauswertung sind diverse Einträge mit NaN hinterlegt. Dort errechnet er in der Schleife einen falschen Fit. Die Fehlerausgabe ist:
Zitat:
Exiting: Maximum number of function evaluations has been exceeded
- increase MaxFunEvals option.
Current function value: NaN


Im Prinzip möchte ich, dass er fitted bis er in dem Laufparameter eine NaN findet. Geht das?
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.