PDA

查看完整版本 : 如何在MATLAB中的相同轴上绘制不同长度的向量?


poster
2019-12-10, 16:49
我在尝试比较和绘制两个不同长度的文件时遇到麻烦。在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, ,,,, 有没有办法做到这一点?这对我有很大帮助,因为我正尝试根据时间戳链接两个文件。

ps:我试图在MATLAB中使用ismember函数,并且遇到各种各样的问题。


回答:
我认为您首先要按照该问题 (https://stackoverflow.com/questions/1641519/reading-date-and-time-from-csv-file-in-matlab)的答案中 (https://stackoverflow.com/questions/1641519/reading-date-and-time-from-csv-file-in-matlab)所述从文件中读取数据。如果您具有时间戳(使用DATENUM (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/datenum.html)转换)并且将两个文件中的数据存储在变量fileData1和fileData2 ,则以下是一种简单的方法来绘制同一组轴上每个数据的数据(使用函数PLOT (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/plot.html)和HOLD) (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/hold.html)命令):

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 上图中的每条线将具有不同数量的时间点(即圆圈标记),但每条线将是连续(即不间断)线。如果要在缺少时间戳的情节中显示中断,可以使用NaN (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/nan.html)值填充文件1中的数据。如果你肯定知道有从来不在较大的文件(即在较小的文件中的时间标记是在较大的时间标记的一个子集)时间戳在较小的文件,然后你可以按以下方式使用ISMEMBER (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/ismember.html)函数:

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 (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/intersect.html)功能(如所示我的回答你的其他相关问题 (https://stackoverflow.com/questions/1753033/timestamp-compare-files/1753680#1753680) )。

现在,您可以使用以下方法绘制数据:

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填充在绘制时(使用一些随机生成的数据)所产生的差异的示例:

https://i37.photobucket.com/albums/e77/kpeaton/example_nan_plot.jpg



更多&回答... (https://stackoverflow.com/questions/1647817)