Java Matlab rechnet falsch zusammen

Zanmatou

Lt. Commander
Registriert
Juni 2007
Beiträge
1.039
Moin,

ich brauche dringend Hilfe:

Ich möchte mir eine Häufigkeit von Windgeschwindigkeiten aus einem xlsx file ausgeben lassen.

Ich habe die Rohdaten in einer Auflösung von 0,1 m/s. Der Zeitraum erstreckt sich über 3 Jahre und ich habe alle 10 Minuten einen Wert für die Windgeschwindigkeit.

Leider kann ich mir die Häufigkeit nicht in einer Auflösung von 0,1 mit Matlab ausgeben lasen, sondern maximal in 0,5er Schritten. Sonst plottet er es falsch und gibt auch bei den Ausgabevariablen falsche Werte an. Das heißt, dort wo werte vorhanden sind macht er 0en rein. Und woanders packt er Werte obendrauf.
Anbei mal ein Beispiel

Wisst ihr woran das liegen kann? Und wie ich das Problem löse.
Zur Info: ein Excel file hat etwa 148000 Zeilen davon hab ich 20 Stück.





Das Beispiel ist nur der Matlab output in Excel gespeichert und geplottet und zusammengeschoben, damit das Problem deutlich wird.
Bei dem Beispiel müssten eigentlich überall Werte stehen. Für einen kürzeren Zeitintervall macht Matlab alles richtig. Aber nicht über den ganzen Zeitintervall.

Vielen Dank schonmal


Zanmatou
 
Zuletzt bearbeitet:
Ich bin etwas verwirrt. Geb mal im komandofenster von Matlab "eps" ein. Mit dieser Genauigkeit rechnet das Program und sollte über die Plots dementsprechend genau ausgeben.

Hast du mal im Workspace geguckt in welchem Datentyp die Werte abgespeichert werden?
 
Welchen Befehl verwendest du denn genau?
Du kannst die vorkommenden Häufigkeiten auch als Intervallvektor angeben (also einen Vektor erstellen mit Werten 0 - 0,1 - 0,2 usw.), dann kannst du mit dem hist-Befehl das Histogramm plotten und den Vektor als bins-Argument angeben.
Die Häufigkeiten kannst du Dir dann ebenfalls als Vektor angeben und aus dem Workspace einfach rauskopieren!
 
Ja also, der Datentyp meines outputs ist double.
Anbei mal ein Beispiel was Matlab da macht.
Bild 1 (oben) ohne Probleme, da ist die Genauigkeit 0,5
Bild 2 (unten) mit Problemen selber Plot mit 0,1er Genauigkeit:





Ich weiß nicht ob das der Teil ist der euch interessiert aber so schauts aus:

if histo == 1
HistALL = [HistALL; data(:,1)];
set(gca,'fontsize',fontsize)
binwidth = 0.5;
binvec = 0:binwidth:20;
h = histc(data(:,1),binvec);
bar(binvec,h/sum(h),'histc')

"data" sind meine eingelesenen Excel-Files. Da ist eben nur die erste Spalte interessant weil da die Geschwindigkeiten stehen. Tjoa und wenn ich binwidth auf 0.1 ändere macht er den unteren Plot. Den komischen. Wie gesagt wenn ich binvec nicht bis 20 laufen lasse sondern nur bis 4 oder 5 gehts auch. Nur den gesamten Bereich kriegt er schon bei einem Excel-File nicht hin.
 
Zuletzt bearbeitet:
Ich bin nicht der MATLAB-Überflieger, aber folgendes stößt mir auf:
- keine Klammern um den bin-Vektor
- das erste Argument im barplot-Befehl sollten die Daten sein
- das Normalisieren der Daten würde ich vor dem Plotten machen
- ich würde auch nicht den Umweg über histc und bar gehen, sondern direkt figure und hist verwenden

...und jetzt hoffe ich, dass das kein ganz großer Unsinn ist....viel Erfolg auf jeden Fall!
 
Mh, danke :-)

Ich bin leider auch kein Matlab - Überflieger. Ich habe mir bei dem File helfen lassen.

Die Klammern sind nicht nicht nötig, sagt matlab :-)
Die anderen Anmerkungen werde ich prüfen. Und mich dann noch mal melden.

Ich habe auch ein anderes File, was mir das ganze nicht mal plotten soll, sondern einfach in einer Matrix ausgibt. Da habe ich das gleiche Problem.

Code:
clc
clear all
close all


load 'Liste.txt'        % hier stehen die Dateinamen der excel Daten drin.


ALLE = cell(12,1);
Jahr = cell(3,1);
Jahr{1,1} = '2009';
Jahr{1,2} = '2010';
Jahr{1,3} = '2011';
MATRIX = cell(3,1);

for jahr = 1:length(Jahr)
    RESULT = [];
    for i = 1:size(Liste,1)
        name = [num2str(Liste(i)), '_rawdata_10m20090101_20111115.xlsx'];
        
        
        prefix = name(2:3);
        [data, txt] = xlsread(['C:\Users\...\',name]);  % gekürzt dargestellt
 
        data = data(:,5:8);           % choose only necessary data
        
       
        monate = cell(12,1);
        monate{1,1} = '01';
        monate{2,1} = '02';
        monate{3,1} = '03'; monate{8,1} = '08';
        monate{4,1} = '04'; monate{9,1} = '09';
        monate{5,1} = '05'; monate{10,1} = '10';
        monate{6,1} = '06'; monate{11,1} = '11';
        monate{7,1} = '07'; monate{12,1} = '12';
        
        for m = 1:12
            II = [];
            for j=1:size(txt,1)
                
                
                if strcmp(txt{j,1}(4:5), monate{m}) && strcmp(txt{j,1}(7:10), Jahr{jahr})
                    II = [II j-1];
                    %                 II = [II j];
                end
                
            end
            ALLE{m,1} = [ALLE{m,1} data(II,1)'];
        end
        
        raus = [];
        for m = 1:1
            vs = [];
            
            vector = [0 0.1 0.2 0.3 0.4 ... 19.8 19.9 20]; % gekürzt dargestellt

            for jj = vector
                indexus = length(find(ALLE{m,1} == jj));
                vs = [vs indexus];
            end
            raus = [raus; vs];
        end
        RESULT = [RESULT raus];
        
        
    end
    
    MATRIX{jahr} = reshape(RESULT,12,201,size(Liste,1)); % 2); ab size
end

               % HIER =  MATRIX{Jahr,1}(Monat,:,Anlage) how to --> einzeln Jahr : 1/2/3
               % Monat: 1/2/3/.../11/12 Anlage: 1/2/.../21

HIER =  MATRIX{1,1}(1:12,:,1);

               % DA = sum(MATRIX{Jahr,1},3); --> alle anlagen aufsummiert 12x201 Matrix

DA = sum(MATRIX{1,1},3);

Das Beispiel ist nicht besonders effizient, sollte es aber auch schaffen eine Lösung zu erbringen. Leider macht er genau den selben Quatsch.

in "HIER" stehen teilweise Nullen wo keine sein dürften
in "DA" stehen überall Werte die nicht stimmen können, weil bei einigen auch 0 stehen müsste.

Ich freue mich, wenn mir jemand helfen kann.


Zanmatou
 
Zuletzt bearbeitet:
Mit dem find Befehl kannst du dir die daten ausgeben lassen, die größer 0 sind, und sie in einem Vektor oder Matrix wieder zurückgeben lassen:
[rows_in_DATA] = find(DATA <threshold); (alternativ auch =0)
DATA(rows_in_DATA) = [];

So ganz versteh ich aber nicht, was du mit dem Programm vorhast. Soll es dir die Daten nach Monaten sortiert ausgeben? Oder nach einem anderen kriterium sortiert?
 
Zurück
Oben