2013-09-30 53 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