2014-10-04 3 views
0

В качестве предисловия я довольно неопытен, поэтому моя терминология может быть выключена, поэтому я ничего не мог найти при поиске на форумах.Эффективно автоматизировать 4-мерное сокращение массива на основе определенного значения измерения

У меня есть огромный 4D массив данных высоты атмосферы (hgt) за год 1900, содержащийся в файле netcdf. Понятно, что масштаб моего проекта прост, создайте климатологию высоты (среднее значение высоты в каждой точке сетки для каждого дня года) на пару конкретных уровней давления, включающих 141 год данных (каждый год файл данных имеет идентичный формат) ,

hgt_1900 = ncread('hgt.1900.nc','hgt') 
n = numel(hgt_1900) 
n = 143488800 

size(hgt_1900) 
ans = 180 91 24 365 

Размеры: долгота, широта, уровень давления и время (дни). Учитывая размер массива, я думал, ограничение данных на один уровень давления (например: уровень 4) на один день был путь

hgt_1900_4_Day1 = hgt_1900(1:180, 1:91, 4, 1) 

Это возвращает 180x91 одну переменную, которая отлично! Однако, к тому времени, когда я добрался до hgt_1900_4_Day3, я понял, что должен быть способ автоматизировать этот процесс. Так вот что я пробовал:

for day = 1:365 
    hgt_1900_4_Day'day' = hgt_1900(1:180, 1:91, 4, 'day') 
    day = +1 
end 
Error: File: Height850.m Line: 2 Column: 20 
Unexpected MATLAB expression. 

Может ли кто-нибудь пролить свет на способы исправить это неожиданное выражение? Я попытался (возможно, ошибочно), используя функцию genvarname вместо, которые должным образом генерируемые имена переменных, но сохраняю 4D переменного формат и не получаю правильные данные дня:

for day = 1:356 
    t = hgt_1900(1:180, 1:91, 4, 'day'); 
    v = genvarname('hgt_1900_4_Day', who); 
    eval([v ' = t']) 
end 

size(hgt_1900_4_Day1) 
ans = 180 91 1 3 

size(hgt_1900_4_Day350) 
ans = 180 91 1 3 

Предполагая, что я могу получить выше для работы, я планировал запустить этот скрипт для каждого года данных. Затем создайте климатологию, усредняя hgt_1900_4_Day50, hgt_1901_4_Day50 и т. Д.

Учитывая совокупный размер данных за 141 год (20231920800 элементов). Я чувствую, что эффективность имеет решающее значение, поэтому, пожалуйста, поделитесь любыми другими, более эффективными способами прибытия в одно и то же место!

спасибо!

+0

Немного смущен. Вы хотите, чтобы ежегодная климатология (то есть средняя за все дни в конкретном году) для определенного уровня давления? – N1B4

+0

Ответил на вопрос ниже! – Ejk3md

ответ

0

Мой брат помог мне получить код ниже, который делает то, что мне нужно!

for year = 1900:2012 
    baseVar = genvarname(['hgt_' int2str(year) '_4_Day']) 

    % Load hgt into memory 

    for day = 1:365 
     t = hgt(1:180, 1:91, 4, day); 
     v = genvarname([baseVar int2str(day)]); 
     eval([v ' = t;']); 
    end 
    clear hgt; 
end 

Благодарим за помощь!