2013-09-30 117 views
0

我有一个时间戳如下。通过填充'NaN'而无插值使向量等于另一个向量

Time = 

    243.0000 
    243.0069 
    243.0139 
    243.0208 
    243.0278 
    243.0347 
    243.0417 
    243.0486 
    243.0556 
    243.0625 
    243.0694 
    243.0764 
    243.0833 
    243.0903 
    243.0972 
    243.1042 
    243.1111 
    243.1181 
    243.1250 
    243.1319 
    243.1389 
    243.1458 
    243.1528 
    243.1597 
    243.1667 
    243.1736 
    243.1806 
    243.1875 
    243.1944  

现在我有另外两列向量。

ab = 

243.0300 0.5814 
243.0717 0.6405 
243.1134 0.6000 
243.1550 0.5848 
243.1967 0.5869 

第一列是'时间2',第二列是'浓'。

Time2 = ab(:,1); 
Conc = ab(:,2); 

现在我想根据'Time2'与'Time'匹配'Conc',但只填写'NaN'。另外'时间2'不完全是'时间'。我可以使用类似以下的东西

Conc_interpolated = interp1(Time2,Conc,Time) 

但它使用人造数据进行插值。我只想通过在'Conc'中填充'NaN'来匹配向量长度,而不是插入数据。任何建议?由于

+0

我不太关注。如果你的意思是创建一个NaN数组,你可以通过以下方法生成NaN数组:nanarray = NaN(size(x)); x这里是Conc – Cosades

+0

但是你的时间和ab完全不符?您能否为这些示例输入提供示例输出?因为它听起来像是希望它有一列只有'NaN' – Dan

+0

@ Dan和Cosades;谢谢。其实你是对的,因为'时间'和'时间2'不匹配,所以输出将是'NaN'。但是我可以使用'Conc_interpolated','时间'和'时间2'彼此最接近。例如上面的'ab'的第一行。 '时间2'是243.0300,'浓度'是'0.5814'。只有考虑到这一点,现在针对'时间'的新矢量中'浓度'0.5814的值可以在243处使用。'时间'中的0278(在此时间点'时间'和'时间2'彼此接近),其余数据为'NaN'。 – Umar

回答

3

我试图猜测你想要什么:

你有时间向量A:

TimeA = ... 
[243.0000; 
    243.0069; 
    ... 
    243.1875; 
    243.1944]; 

,可能有一些数据答:

DataA = rand(length(TimeA),1); 

现在你要实现你的第二个时间向量B:

TimeB = ... 
[243.0300;  
    243.0717;  
    243.1134;  
    243.1550;  
    243.1967]; 

和相应的数据:

DataB = ... 
[0.5814; 
    0.6405; 
    0.6000; 
    0.5848; 
    0.5869]; 

终于一切都应该被合并在一起,并进行排序:

X = [ TimeA, DataA , NaN(size(DataA)) ; 
     TimeB, NaN(size(DataB)) , DataB ] 

Y = sortrows(X,1); 

结果:

Y = 

    243.0000 0.8852  NaN 
    243.0069 0.9133  NaN 
    243.0139 0.7962  NaN 
    243.0208 0.0987  NaN 
    243.0278 0.2619  NaN 
    243.0300  NaN 0.5814 
    243.0347 0.3354  NaN 
    243.0417 0.6797  NaN 
    243.0486 0.1366  NaN 
    243.0556 0.7212  NaN 
    243.0625 0.1068  NaN 
    243.0694 0.6538  NaN 
    243.0717  NaN 0.6405 
    243.0764 0.4942  NaN 
    243.0833 0.7791  NaN 
    243.0903 0.7150  NaN 
    243.0972 0.9037  NaN 
    243.1042 0.8909  NaN 
    243.1111 0.3342  NaN 
    243.1134  NaN 0.6000 
    243.1181 0.6987  NaN 
    243.1250 0.1978  NaN 
    243.1319 0.0305  NaN 
    243.1389 0.7441  NaN 
    243.1458 0.5000  NaN 
    243.1528 0.4799  NaN 
    243.1550  NaN 0.5848 
    243.1597 0.9047  NaN 
    243.1667 0.6099  NaN 
    243.1736 0.6177  NaN 
    243.1806 0.8594  NaN 
    243.1875 0.8055  NaN 
    243.1944 0.5767  NaN 
    243.1967  NaN 0.5869 

是这样吗?

+0

非常感谢:-)完美 – Umar

2

我的理解是有一点不同,它不添加到Time而是给每个Conc基于它的nearst TimeTime2

ind = zeros(size(ab,1),1); %//preallocate memory 
for ii = 1:size(ab,1) 
    [~, ind(ii)] = min(abs(ab(ii,1)-Time)); %//Based on this FEX entry: http://www.mathworks.com/matlabcentral/fileexchange/30029-findnearest-algorithm/content/findNearest.m 
end 

Time(:,2) = NaN; %// Prefill with NaN 
Time(ind, 2) = ab(:,2) 

这导致:

Time = 

    243.00000   NaN 
    243.00690   NaN 
    243.01390   NaN 
    243.02080   NaN 
    243.02780  0.58140 
    243.03470   NaN 
    243.04170   NaN 
    243.04860   NaN 
    243.05560   NaN 
    243.06250   NaN 
    243.06940  0.64050 
    243.07640   NaN 
    243.08330   NaN 
    243.09030   NaN 
    243.09720   NaN 
    243.10420   NaN 
    243.11110  0.60000 
    243.11810   NaN 
    243.12500   NaN 
    243.13190   NaN 
    243.13890   NaN 
    243.14580   NaN 
    243.15280  0.58480 
    243.15970   NaN 
    243.16670   NaN 
    243.17360   NaN 
    243.18060   NaN 
    243.18750   NaN 
    243.19440  0.58690 

为你举例输入

+0

@ Dan,非常感谢您的回答,这完全是我的要求。如果'ab'是几列而不是两列的矩阵,请问你能告诉我,而不是我如何改变你上面提到的代码? – Umar

+0

只需按如下方式更改最后两行:时间(:,2:size(ab,2))= NaN;时间(ind,2:结束)= ab(:,2:结束);' – Dan