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

Statistische Kennzahlen von ganze Matrizen

 

adi
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 02.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2017, 11:23     Titel: Statistische Kennzahlen von ganze Matrizen
  Antworten mit Zitat      
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 Smile

Gruss
Adi
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 02.02.2017, 11:51     Titel: Re: Statistische Kennzahlen von ganze Matrizen
  Antworten mit Zitat      
Hallo adi,

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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
adi
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 02.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2017, 12:34     Titel:
  Antworten mit Zitat      
Hallo Jan,

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:

>> dbstop if error % 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 if error
mean(1) = mean( Result(1).uv(:), 'omitnan');
Subscript indices must either be real positive integers or logicals.


Also einfach mal nur den Vektor aufgerufen:
Code:
Result(1).uv(:)

dies funktioniert!



Fürs volle Verständnis hier der Code:

Code:
%% -------- Get going ---------- %%
close all;
clear all;
cd('/Users/adrian/Documents/UZH/MA/ImGraft/UpperTLC_Displacement');
datafolder=('/Users/adrian/Documents/UZH/MA/ImGraft/UpperTLC_Displacement');
%% Construct a testset table
img =['L1140680.jpg';
    'L1140681.jpg';
    'L1140682.jpg';
    'L1140683.jpg';
    'L1140684.jpg';
    'L1140685.jpg';
    'L1140686.jpg';
    'L1140687.jpg';
    'L1140688.jpg';
    'L1140689.jpg';
    'L1140690.jpg';
    'L1140691.jpg';
    'L1140692.jpg';
    'L1140693.jpg';
    'L1140694.jpg';
    'L1140695.jpg';
    'L1140696.jpg';
    'L1140697.jpg';
    'L1140698.jpg';
    'L1140699.jpg';
    'L1140700.jpg';
    'L1140701.jpg';
    'L1140702.jpg';
    'L1140703.jpg';]
%%
% --------- Add stuff ---------- %%
j= length(img(:,1))-1; % Anzhal Testbilder -1
for i= 1:j % without ;, the value i=1:j is indicating the progress
    imgA = img(i,:);
    imgB = img(i+1,:); %
   
    A=imread(fullfile(datafolder,'Pix/',imgA));
    B=imread(fullfile(datafolder,'Pix/',imgB));
   
    % --------- create mask ----------%
    mask=uint8(rgb2gray(imread(fullfile(datafolder, 'glaciermask.jpg'))) > 1);
    %load image of glacier mask, make it gray scale, reduce it to a binary and reduce it to 8 bits.
   
    % --------- Convert ---------- %
    %to gray scale images, as functions below can't handle RGB's
    A_mono = rgb2gray(A);   B_mono = rgb2gray(B);
    %   A_mask = mask.*A_mono;  B_mask = mask.*B_mono;
   
    % --------- 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
   
    [du,dv,C,Cnoise,pu,pv]=templatematch(A_mono,B_mono,'templatewidth',61,'searchwidth',120,'supersample',2,'initialdu',duoffset,'initialdv',dvoffset);
   
   
    %display figure
    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
   
end

%% 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


irgendwelche Ideen?

Gruss

Adi
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.02.2017, 20:14     Titel:
  Antworten mit Zitat      
Hallo,

ein Problem ist, dass du eine Variable mean nennst und dann die Funktion mean verwenden willst. Die Variable solltest du dringend umbenennen.

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 02.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.02.2017, 04:22     Titel:
  Antworten mit Zitat      
Hallo Harald!

Ich danke dir!
Das Problem ist gelöst, der Fehler ist weg, der Plot funktioniert!!

Gruss

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