Verfasst am: 02.02.2017, 11:23
Titel: Statistische Kennzahlen von ganze Matrizen
Hallo Liebes Forum!
Kurz das Anliegen erklärt:
Ich stehe gerade an beim Versuch meine Berechnungen dar zu stellen. Das Problem: statistische Kennzahlen einer Matrix zu berechnen (und anschliessend dann zu Plotten).
Was ich auch versuche, irgendwie kommt mir die 'real positiv integer' oder die 'logicals' etc. in die Quere.
Hintergrund:
In meinem Fall handelt es sich um einen Gletscher, dessen Fliessen ich quantifizieren will. Dazu berechne ich den Versatz von Objekten in zwei Bildern (zu unterschiedlichen Zeiten, gleicher Standort aufgenommen), mittels feature tracking.
Daten:
Das Ganze ist in einem for loop aufgebaut. Ich speise Matlab eine Liste von Bildern, indexiere (i) diese und sage dann es soll jeweils Bild i mit Bild i+1 verrechnen.
Das Resultat speichere ich am Ende (aber noch innerhalb) des loops, mit:
Code:
for i= 1:j % j ist definiert als die Anzahl der Bilder -1
//
//
//
% --------- Save Results ---------- %%
Result(i).u= du; % tracked displacement in u coordinates
Result(i).v= dv; % tracked displacement in v coordinates
Result(i).uv = sqrt((du.^2)+(dv.^2))% value of the off set
Result(i).peakCorr = C; % peakCorr is the maximum correlation coefficient found at the location of each match.
Result(i).meanAbsCorr =Cnoise; % meanAbsCorr is the average or typical correlation coefficient over the entire search window.
Result(i).imgA= [imgA]; % Date & Time of fixed picture
Result(i).imgB= [imgB]; % Date & Time of moving picture
Result(i).duoffset =duoffset; % Off set in pixel units in u direction
Result(i).dvoffset =dvoffset; % Off set in pixel units in v direction end
So habe ich also duzende Matrizen der gleichen Grösse (z.B. 33x60).
Nun möchte ich gerne (nach Verwendung einer Maske), den Versatz darstellen (um zu sehen, ob es einen Trend über die Zeit gibt, zB. Beschleunigung der Fliessbewegung im Frühjahr/Sommer)
Dazu möchte ich gerne den Mittelwert, den Median, die Standardabweichung, das obere und untere Quantil etc. auf der Y-Achse gegenüber zum Zeitpunkt (des zweiten Bildes) auf der X-Achse plotten (Zeitpunkt des Bildes in .txt oder aus EXIF Daten rauszulesen).
Da stehe ich an, denn wenn ich etwas wie
Code:
for i=1:j
mean(i) = mean(mean( Result(i).uv , 'omitnan'), 'omitnan');
end
kommt die Fehlermeldung, dass:
"Subscript indices must either be real positive integers or logicals."
Klar, das ist es nicht, aber das wird es auch nie sein. die Werte sind u.a.:
0, NaN, -1.523, 2.124, 12.563, -23.551
Die Frage also: Wie kann ich dies umgehen?
Nun könnte ich das für den Mittelwert zwar händisch machen, indem ich zuerst die Mittelwerte der Reihen ausgeben lasse (dies funktioniert) und in eine Variable speichere, welche ich anschliessend dann nochmals aufsummiere und durch die Anzahl teile. Bei der Standardabweichung oder dem Quantil wird's jedoch etwas komplizierter (da hier nicht mehr zuerst in Reihe und dann Spalte vorgegangen werden kann).
Könnt Ihr mir helfen?
Ich wäre euch überaus dankbar, das Klima evtl. auch
Bitte poste den relevanten Abschnitt aus dem realen Code und eine vollständige Kopie der Fehlermeldung.
Zitat:
die Werte sind u.a.:
0, NaN, -1.523, 2.124, 12.563, -23.551
Welche Werte sind das?
Die Fehlermeldung betrifft nicht die Werte, sondern die Indices. Diese dürfen nur ganzzahlig sein. In dem gezeigten Code-Abschnitt tritt aber nur "i" als Index auf, und der sollte ganzzahlig sein, wenn er in "for i=1:j" erzeugt wird. Ich vermute also, dass der Fehler an einer Stelle liegt, die Du noch nicht gepostet hast.
Vorab: Besten dank für die schnelle Reaktionszeit!
Ach so, ja meine Werte beziehen sich auf die Werte in der Matrix.
Der wichtigste Teil des Codes habe ich bereits gepostet. Um sicher zu gehen, dass ich nicht auf ein altes j zugreife habe ich erneut alles gelöscht (clear all) und dann nochmals wie folgt den Befehl aufgerufen.
Code:
>> %% Plot Stats X Time.
j= length(img(:,1))-1; % Anzhal Testbilder -1
j % wiedergabe des wertes J um sicherzu stellen, dass ganzzahlig for i=1:j
mean(i) = mean(mean( Result(i).uv, 'omitnan'), 'omitnan');
end
j =
23
Subscript indices must either be real positive integers or logicals.
Also, weiter: geht es dann wenigstens in den Reihen?
Code:
>> dbstopiferror% hilf Fehler zu finden
j= length(img(:,1))-1; % Anzhal Testbilder -1
j % wiedergabe des wertes J um sicherzu stellen, dass ganzzahlig for i=1:j
mean(i) = mean( Result(i).uv(:), 'omitnan');
end
j =
23
Subscript indices must either be real positive integers or logicals.
Merke: ich habe hier nach dem Result(i).uv ein ( : ) eingefügt, damit sich die Matrix als Vektor darstellen lässt, und so die Berechnung über sämtliche Zahlen geht.
Danach versucht für i direkte Werte einzusetzen (hier Wert 1). Et voilà, es funktioniert immer noch nicht!:
Code:
>>dbstop iferror mean(1) = mean( Result(1).uv(:), 'omitnan');
Subscript indices must either be real positive integers or logicals.
% --------- create mask ----------%
mask=uint8(rgb2gray(imread(fullfile(datafolder, 'glaciermask.jpg'))) > 1);
%loadimage of glacier mask, make it gray scale, reduce it to a binary and reduce it to 8 bits.
% --------- Assume offset --------- % % Literature: Messerli, A. and Grinsted, A. (2015) Image georectification and feature tracking toolbox: ImGRAFT?, Geoscientific Instrumentation, Methods and Data Systems, 4(1), pp. 23?34. doi: 10.5194/gi-4-23-2015. % See also http://imgraft.glaciology.net [duoffset,dvoffset]=templatematch(A_mono,B_mono,1750,640,'templatewidth',110,'searchwidth',220,'supersample',0.5);
% --------- Displacement ---------- %
%[pu,pv]=meshgrid(42:840:4200,23:460:2300);
%pu=pu(:)+pv(:)/23; pv=sort(pv(:)+pu/23); %weshalb hier das +pu/10
[pu,pv]=meshgrid(42:934:4200,23:920:2300); % das Verhältnis ist ca 9:5, also auch hier dies einhalten?!
pu=pu(:)+pv(:)/23; pv=sort(pv(:)+pu/23); %weshalb hier das +pu/10
%displayfigure figure hold on
subplot(2,2,1)
imshowpair(A_mono, B_mono,'Scaling','joint') title({'Visualisation image congruence', 'u offset',[duoffset],'v offset',[dvoffset]}) subplot(2,2,2) axis equal ij off tight
quiver(pu, pv,'k','LineStyle','none','Marker','.') quiver(du, dv, 'b') title({[imgA(1:8)],'-',[imgB(1:8)]}) subplot(2,2,3) imagesc(C) colorbar title('peak correlation coeff') subplot(2,2,4) imagesc(Cnoise) colorbar title('mean absolut correlation coeff') % hold off %if inactive, only the actual figure is presented at a time % --------- Save Results ---------- %%
Result(i).u= du; % tracked displacement in u coordinates
Result(i).v= dv; % tracked displacement in v coordinates
Result(i).uv = sqrt((du.^2)+(dv.^2)); %value of the offset
Result(i).peakCorr = C; %peakCorr is the maximum correlation coefficient found at the location of each match.
Result(i).meanAbsCorr =Cnoise; %meanAbsCorr is the average or typical correlation coefficient over the entire search window.
Result(i).imgA= [imgA]; %Date & Time of fixed picture
Result(i).imgB= [imgB]; %Date & Time of moving picture
%% Plot Stats X Time.
j= length(img(:,1))-1; % Anzhal Testbilder -1
j %wiedergabe des wertes J um sicherzu stellen, dass ganzzahlig
for i=1:j
mean(i) = mean(mean( Result(i).uv, 'omitnan'), 'omitnan');
end
Ich danke dir!
Das Problem ist gelöst, der Fehler ist weg, der Plot funktioniert!!
Gruss
Adi
Einstellungen und Berechtigungen
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
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.