Длина ячейки Matlab - PullRequest
       11

Длина ячейки Matlab

1 голос
/ 18 февраля 2010

Хорошо. Кажется, я решил большую часть проблемы, мне просто нужен экспертный глаз, чтобы определить мою ошибку, когда я застрял.

У меня есть файл длиной [125 X 27], и я хочу преобразовать его в файл длиной [144 x 27]. Теперь я хочу заменить отсутствующие файлы (временные метки) рядами нулей. (в идеале это среднее значение за 10 минут, поэтому длина файла должна составлять 144)

Вот код, который я использую:

fid = fopen('test.csv', 'rt');

data = textscan(fid, ['%s' repmat('%f',1,27)], 'HeaderLines', 1, 'Delimiter', ',');

fclose(fid);

%//Make time a datenum of the first column
time = datenum(data{1} , 'mm/dd/yyyy HH:MM')
%//Find the difference in minutes from each row

timeDiff = round(diff(datenum(time)*(24*60)))

%//the rest of the data
data = cell2mat(data(2:28));


newdata=zeros(144,27);

for n=1:length(timeDiff)

    if timeDiff(n)==10

        newdata(n,:)=data(n,:);
        newdata(n+1,:)=data(n+1,:);
    else
        p=timeDiff(n)/10
        n=n+p;

    end

end

Может кто-нибудь помочь мне найти ошибку в моем цикле for. Мой выходной файл, кажется, пропускает несколько значений с метками времени.

% ********************************************** ************************************************** ************************************************** ***********************************

Может кто-нибудь помочь мне разобраться в uiget для чтения вышеуказанного файла ??

я заменяю

fid = fopen ('test.csv', 'rt');

data = textcan (fid, ['s% repmat ('% f ', 1,27)],' HeaderLines ', 1,' Delimiter ',', ');

fclose (FID);

С

[c, pathc] = uigetfile ({'*. Txt'}, 'Выберите файл', 'C: \ data');

file = [pathc c];

file = textcan (c, ['% s' repmat ('% f', 1,27)], 'HeaderLines', 1, 'Delimiter', ',');

И это не работает

%


НОВОЕ ДОБАВЛЕНИЕ к старому вопросу

р = 1; % индекса в пункт назначения
для n = 1: длина (timeDiff)
% if timeDiff (n) == 10
% newfile (p, :) = file (n,:);
% newfile (p + 1,:) = файл (n + 1,:);
% p = p + 1;
% else
% p = p + (timeDiff (n) / 10);
% end

* +1054 * д = cumsum (TimeDiff (п) / 10);

если q == 1
NewFile (р,:) = файл (п,:);
р = р + 1;
еще
p = p + (timeDiff (n) / 10);

конец

конец

xlswrite ( 'testnewws11.xls', NewFile);

даже с командой cumsum этот код завершается ошибкой, когда мой файл имеет 1,2 метки времени в середине длинных пропущенных пример

8/16/2009 0:00 5,34
16.08.2009 0:10 3,23
16.08.2009 0:20 2,23
16.08.2009 0:30 1.23
16.08.2009 0:50 70
16.08.2009 2:00 5.23
16.08.2009 2:20 544
16.08.2009 2:30 42.23
16.08.2009 3:00 71,23
16.08.2009 3:10 3,23

Мой вывод выглядит как

5,34
3,23
2,23
0
0
0
0
0
0
0
0
0
5,23
544.
42,23
0
0
0
3,23

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 19 февраля 2010

По второму вопросу:

Uigetfile возвращает имя файла, а не идентификатор файла. Поэтому вам все равно нужно позвонить в fopen.

[c,pathc]=uigetfile({'*.txt'},'Select the file','C:\data');

file=[pathc c];

%# get a file ID
fid = fopen(file,'rt');

data= textscan(fid, ['%s' repmat('%f',1,27)], 'HeaderLines', 1, 'Delimiter', ',');

fclose(fid)
2 голосов
/ 18 февраля 2010

Обновление для новой версии вопроса

Похоже, вы неправильно поняли намерение решения cumsum, которое я предложил.Вам больше не нужен цикл, поскольку cumsum рассчитывает для вас окончательные значения.Тем не менее, я упустил одну важную часть - первый индекс все еще должен быть определен из файла данных.Замените цикл for следующим:

[y,m,d] = datevec(time(1)); %# get the year, month and day corresponding to the first recorded timestamp
firstidx = time(1)-datenum(y,m,d,0,0,0)+1; %# get the offset from midnight to the first recorded timestamp
q = cumsum([firstidx ; round(diff(time)*24*60)/10]); %# these are the indeces into newdata
newdata(q,:) = data;

Предыдущие ответы

Вы используете n для индексации как новых данных, так и данных и прекращаете свою индексацию на основедлина (TimeDiff).Это означает, что ваш цикл никогда не будет касаться элементов newData сверх длины (timeDiff).Кроме того, я совсем не понимаю, что делает строка newdata(n+1,)..., поскольку она все равно будет перезаписана на следующей итерации.Я думаю, что вам нужно что-то вроде:

p = 1; %index into destination
for n = 1:length(timeDiff)
    if timeDiff(n) == 10
        newdata(p,:) = data(n,:);
        p = p + 1;
    else
        p = p + timeDiff(n)/10;
    end
end

Вы можете сделать это немного аккуратнее, выполнив:

p = cumsum(timeDiff(n)/10); % vector of destination indeces
newdata(p) = data;

(я на самом деле не проверял это ...)

Обратите внимание, что эта схема зависит от вектора timeDiff, содержащего целочисленные значения!Вам, возможно, придется также позвонить на номер round.

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