Как построить векторы разной длины на одинаковых осях в MATLAB? - PullRequest
1 голос
/ 30 октября 2009

У меня проблемы с попыткой сравнить и построить два файла разной длины. В MATLAB я не знаю, как построить два вектора разной длины на одной оси X. Поскольку в одном файле отсутствуют некоторые данные, я хочу создать строку и оставить пустое место для соответствующей метки времени. Вот примеры файлов данных:

файл 1:

date time  T01  T02  T03  T04  T05
8/16/2009 0:00, 516.900024, 450.5,      465.200012, 546.799988, 539.700012
8/16/2009 0:10, 351.200012, 398.899994, 418.100006, 510.299988, 518.5
8/16/2009 0:30, 241.399994, 252.399994, 256,        360.600006, 386.5
8/16/2009 1:00, 184.199997, 154.300003, 143.899994, 236.600006, 244.399994

файл 2:

date time  T01  T02  T03  T04  T05
8/16/2009 0:00, 656.799988, 611.200012, 860.599976, 604.700012, 288.5
8/16/2009 0:10, 527.400024, 359.200012, 789.099976, 789.099976, 446.799988
8/16/2009 0:20, 431.5,      327.100006, 763.599976, 895.099976, 689.099976
8/16/2009 0:30, 328.399994, 301.700012, 824,       1037.099976, 955.299988
8/16/2009 0:40, 261.5,      332.200012, 811.700012, 962.200012, 915.599976
8/16/2009 0:50, 180.300003, 291.100006, 700.099976, 855.200012, 836.900024
8/16/2009 1:00, 294.399994, 281.399994, 731.299988, 881.700012, 666.200012
8/16/2009 1:10, 274.899994, 334.200012, 759.400024, 913.900024, 760.799988

Я пытаюсь переделать файл 1 следующим образом:

8/16/2009 0:00, 516.900024, 450.5,      465.200012, 546.799988, 539.700012
8/16/2009 0:10, 351.200012, 398.899994, 418.100006, 510.299988, 518.5
8/16/2009 0:20, ,,,,
8/16/2009 0:30, 241.399994, 252.399994, 256,        360.600006, 386.5
8/16/2009 0:40, ,,,,
8/16/2009 0:50, ,,,,
8/16/2009 1:00, 184.199997, 154.300003, 143.899994, 236.600006, 244.399994
8/16/2009 1:10, ,,,,

Есть ли способ сделать это? это мне очень поможет, так как я пытаюсь связать 2 файла на основе отметок времени.

p.s .: Я пытаюсь использовать функцию ismember в MATLAB и у меня возникают всевозможные проблемы.

1 Ответ

2 голосов
/ 18 ноября 2009

Я предполагаю, что вы сначала читаете данные из файлов, как описано в ответах на этот вопрос . Если у вас есть метки времени (преобразованные с использованием DATENUM ) и данные из двух файлов, хранящиеся в переменных fileData1 и fileData2, ниже приведен простой способ нанести данные из каждого на один набор. осей (используя функцию PLOT и команду HOLD ):

t1 = fileData1(:,1);  %# Time-stamps for file 1
d1 = fileData1(:,2);  %# First column of data for file 1
plot(t1,d1,'ro-');    %# Plot data from file 1, using a red line with circles
hold on;
t2 = fileData2(:,1);  %# Time-stamps for file 2
d2 = fileData2(:,2);  %# First column of data for file 2
plot(t2,d2,'bo-');    %# Plot data from file 2, using a blue line with circles

Каждая линия на приведенном выше графике будет иметь различное количество временных точек (то есть маркеров окружности), но каждая будет непрерывной (то есть непрерывной) линией. Если вы хотите показать разрывы на графике, где отсутствуют метки времени, вы можете дополнить данные из файла 1 значениями NaN . Если вы точно знаете, что в файле меньшего размера нет меток времени, то не будет в файле большего размера (т. Е. Что метки времени в файле меньшего размера являются подмножеством меток времени в чем больше), то вы можете использовать функцию ISMEMBER следующим образом:

newData = nan(size(fileData2));      %# New file 1 data, initialized to NaN
t = fileData2(:,1);                  %# Use the time-stamps from file 1
index = ismember(t,fileData1(:,1));  %# Find row indices of common time-stamps
newData(:,1) = t;                    %# Copy time-stamps
newData(index,:) = fileData1;        %# Copy data

Если в меньшем файле есть метки времени, которых нет в большем, вам придется использовать решение на основе функции INTERSECT (как показано на мой ответ на другой связанный с вами вопрос ).

А теперь вы можете построить данные, используя следующее:

d1 = newData(:,2);            %# First column of padded data for file 1
d2 = fileData2(:,2);          %# First column of data for file 2
plot(t,d1,'ro-',t,d2,'bo-');  %# Plot both lines

Вот пример различия, которое делает NaN-заполнение при построении (используя некоторые случайно сгенерированные данные):

alt text

...