Функция MATLAB для импорта данных из текстовых файлов и вычисления средних значений - PullRequest
1 голос
/ 16 февраля 2012

Я написал следующую функцию, которая импортирует файлы .txt в MATLAB . Файлы .txt могут быть записаны либо с почасовыми интервалами, либо с 4-минутными интервалами, где, в зависимости от исходного разрешения, скрипт будет рассчитывать среднечасовые или суточные значения.

function [Daily, Hourly] = calc_avg(pathName)
    TopFolder = pathName;
    dirListing = dir(fullfile(TopFolder,'*.txt'));%#Lists the folders in the directory
                                                  %#specified by pathName.
    for i = 1:length(dirListing);
        fileToRead1{i} = (dirListing(i).name);
        %#lists all of the .txt files in the TopFolder
    end
    cell_all = arrayfun(@(i1)importdata(fullfile(pathName,dirListing(i1).name)),...
        (1:length(dirListing))','un',0); %#'

    %# Apply function to each element of the array.
    d = cat(2,cell_all{:});

    %# Concatenate arrays along each column (i.e. 2).
    %# Find the length of the dataset, which will provide information on the
    %# amount of averaging required.
    if length(d) == 365,...
            error('error: daily averages already calculated'); %#'
    elseif length(d) == 8760;
        daily = squeeze(mean(reshape(d,24,size(d,1)/24,[])));
    elseif length(d) == 131400;
        hourly = squeeze(mean(reshape(d,15,size(d,1)/15,[])));
        daily = squeeze(mean(reshape(d,360,size(d,1)/360,[])));
    end

    %# Find which averages have been calculated:
    A = exist('hourly','var');

    %# If A == 1 means that hourly values had to be calculated therefore
    %# the data if of high resolution (minutes).
    if A == 1;
        hourly = mat2cell(hourly,size(hourly,1),cellfun('size',cell_all,2)).'; %#'
        daily = mat2cell(daily,size(daily,1),cellfun('size',cell_all,2)).'; %#'
    elseif A == 0;
        daily = mat2cell(daily,size(daily,1),cellfun('size',cell_all,2)).';%#'
    end

    %# Create cell in the same format as 'cell_all' where cellfun applies the
    %# same function to each cell in a cell array. 'size' is used to create
    %# the same format.
    for i=1:length(dirListing);
        [~,name{i}] = fileparts(fileToRead1{i});
        %# Obtain the name of each of the .txt files (dirListing)
    end

    %#Generate a structure for the averages calculated.
    if A == 1;
        for i=1:length(dirListing);
            Daily.(genvarname(name{i})) = daily{i};
            Hourly.(genvarname(name{i})) = hourly{i};
        end
    elseif A == 0;
        for i=1:length(dirListing);
            Daily.(genvarname(name{i})) = daily{i};
        end
end

Скрипт работает нормально, если я просто запускаю его как скрипт, т.е. избегаю использования функции и просто набираю имя пути во второй строке. Но как только я пытаюсь использовать if как функцию, она не работает. Выдает ошибку:

Error in calc_avg (line 15)
TopFolder = pathName;

Что я делаю не так? Возникает ли проблема из-за того, что pathName является строкой?

1 Ответ

4 голосов
/ 16 февраля 2012

Вы должны сохранить функцию в отдельном файле с именем calc_avg.m (в текущей папке или папке в пути MATLAB) и запустить ее из отдельного сценария или командной строки как

pathName = 'path/to/file';
[Daily, Hourly] = calc_avg(pathName)

Возможно, вы получили ошибку, потому что пытаетесь запустить функцию как скрипт в редакторе с помощью Run (f5).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...