2017-01-26 13 views
1

ich einen einfachen Beispiel-Datensatz unten habe:Kumulative Matrix, die für Spalte Startpunkte-Konten

a = 

1 1 1 NaN NaN 
1 1 1 NaN NaN 
1 1 1 1 NaN 
1 1 1 1 1 
1 1 1 1 1 

Ich mag den durchschnittlichen kumulierte Wert pro Zeile erarbeiten. Allerdings gibt cumsum die folgende Ausgabe:

cumsum(a) 

1 1 1 NaN NaN 
2 2 2 NaN NaN 
3 3 3 1 NaN 
4 4 4 2 1 
5 5 5 3 2 

Dann eine Reihe Berechnung bedeuten ergibt:

nanmean(a,2) 

1 
2 
2.5 
3 
4 

ich für die Tatsache zu berücksichtigen, in der Lage sein wollen, dass verschiedene Spalten später dh die Zeilenmittelwerte starten Zeilen (3: 5) sind aufgrund ihrer niedrigen Werte in Spalten (4: 5) in Bezug auf ihre wahren Werte reduziert.

Ich möchte dies erreichen, indem ich das letzte NaN über dem ersten numerischen Element in jeder Spalte in der Matrix (a) durch den Mittelwert der anderen Spalten in dieser Zeile in der kumulativen Matrix ersetze. Dies müsste iterativ erfolgen um die sich ändernden Werte in der kumulativen Matrix widerzuspiegeln. So ist die neue Matrix würde zuerst wie folgt aussehen:

(a) 

1 1 1 NaN NaN 
1 1 1 *2* NaN 
1 1 1 1 NaN 
1 1 1 1 1 
1 1 1 1 1 

die dazu führen würde:

cumsum(a) 

1 1 1 NaN NaN 
2 2 2 2 NaN 
3 3 3 3 NaN 
4 4 4 4 1 
5 5 5 5 2 

und dann iterativ, (a) wäre gleich:

(a) 

1 1 1 NaN NaN 
1 1 1 2 NaN 
1 1 1 1 *3* 
1 1 1 1 1 
1 1 1 1 1  

, die führen würde :

cumsum(a) 

1 1 1 NaN NaN 
2 2 2 2 NaN 
3 3 3 3 3 
4 4 4 4 4 
5 5 5 5 5 

was würde geben Sie die gewünschte Zeile bedeutet Werte wie:

nanmean(a,2) 

1 
2 
3 
4 
5 

Antwort

0

Es kann einen Weg geben, dies weiter zu vektorisieren. Ich glaube aber, dass da jede Zeile auf den vorherigen Werten abhängt, können Sie die Matrix Zeile-für-Zeile aktualisieren müssen Sie wie folgt vor:

% Cycle through each row in matrix 
for i = 1:length(a) 

    if i > 1 

     % This makes elements equal to the sum of themselves and above element 
     % Equivalent outcome to cumsum 
     a(i,:) = a(i,:) + a(i-1,:); 

    end 

    % Replace all NaN values in the row with the average of the non-NaN values 
    a(i,isnan(a(i,:))) = mean(a(i,~isnan(a(i,:)))); 

end 

Dies repliziert Ihre Eingangs- und Ausgangs Beispiele. Es repliziert nicht alle Ihre iterativen Schritte, es verwendet tatsächlich viele weniger Schritte, nur 5 (Anzahl der Zeilen) für die gesamte Operation.

Edit: gleich,

for i = 1:length(a) 

    % Replace all NaN values in the row with the average of the non-NaN values 
    a(i,isnan(a(i,:))) = mean(a(i,~isnan(a(i,:)))); 

end  

a = cumsum(a); 
+0

Vielen Dank für Ihre Antwort, die auf dem obigen Beispiel zu funktionieren scheint. Meine tatsächlichen Daten sind jedoch wesentlich komplexer. Verwenden Sie Ihren Code nur für einen geringfügig komplexeren Datensatz, z. a = [1 1 1 NaN NaN; 2 2 2 NaN NaN; 3 3 3 1 NaN; 4 4 4 2 1; 5 5 5 3 2]; führt zu einem falschen Ergebnis. –

+0

Wie ist es falsch? was würdest du erwarten? – Wolfie

+0

Keine Sorge, ich habe einen Workaround gefunden, der das Problem behebt. Prost für deine Hilfe. –

Verwandte Themen