2017-07-24 4 views
-1

Ich hoffe, dass ich für diese Frage nicht gekaut werde, aber ich suche nach einem effizienteren Weg, um diese kleine Aufgabe in MATLAB zu erledigen. Grundsätzlich habe ich eine Liste von Jahren mit entsprechenden Werten, wobei Jahre wiederholt werden. Zum Beispiel:Effizienterer Weg, gewisse Zeilen der Matrix bedingt zu halten

...

1910 1,04

1910 2,53

1910 0,94

1911 2,13

1911 5,32

...

Ich möchte eine Reihe von Jahren auswählen und den Durchschnitt über alle Werte in Spalte 2 nehmen, die ein Jahr in diesem Bereich hat. Das mache ich gerade, indem ich ein logisches Array von max_year> = data (:, 1)> = min_year mache und dieses Array mit Daten (:, 2) verkettet (zB new_data = horzcat (logical_array, data (:, 2))), mit "find", um die Indizes dieses Arrays zu markieren, die entweder 0 oder 1 und dann, wenn es 1 ist, ziehen das Jahr von Daten zu Daten2 und wenn es 0 ist entfernen diese Zeile vollständig. Diese

ist, was der Code sieht aus wie

years = rawdata(:,yearcolumn);    %extracts year vector from data 
years = years>=firstyear_i&years<maxyear; %labels which rows we are considering 
levels = [years,rawdata(:,datacolumn)]; %new vector where first column shows if being considered and second is rawdata for that row 
indices1 = find(levels(:,1)==0);   %indexes rows for deletion 
indices2 = find(levels(:,1)==1);   %indexes rows we are using 
levels(indices2,1) = rawdata(indices2,1); %if using row, replace "1" with appropriate year from rawdata 
levels(indices1,:) = [];     %if not using row, remove it from data we are considering 

Ich frage mich, ob es einen besseren Weg, entweder dies zu tun. Vielen Dank!

Antwort

0

Ein paar zu viele Schritte drin. Verwenden Sie einfach einen Index dessen, was Sie wollen und nehmen Sie den Durchschnitt. So:

values = [1910 1.04;1910 2.53;1910 0.94;1911 2.13;1911 5.32]; 
index = values(:,1) == 1910; 
av = mean(values(index, 2)); 

Für diesen Fall av = 1.503333333333.

Um nur das Zeug zu speichern (und nicht alles später entfernen) tun Sie dies.

stuffToKeep = values(index,:); 
stuffToKeep = values(values(:,1) == 1910,:); % 1-liner if you don't want to save the index 

Wenn Sie Informationen für später speichern möchten, speichern Sie den Index und rufen Sie ihn bei Bedarf erneut auf.

years = unique(values(:,1)); 
% then find all the values that match each year 
[~, yearIndex] = ismember(values(:,1), years); 
% use the index 
mean(values(yearIndex == 1,2)); % same as before average of 1910 
mean(values(yearIndex == 2,2)); % average of 1911 

Was zu einer Reihe? Gleiche Logik.

index = values(:,1) >= 1910 & values(:,1) <= 1920; 
mean(values(index,2)); %average of values between 1910 and 1920 inclusive. 

ist hier ein gutes example der Indizierung von Mathworks Menschen. Versuchen Sie auch, logical indexing in die Hilfe einzugeben.

+0

Dies ist genau das, was ich übersehen habe. Ich habe vergessen, dass die logische Indexierung in MATLAB funktioniert :). Ich wusste, dass ich viel zu viele Schritte hatte, weshalb ich hierher kam, haha. –

Verwandte Themen