summaryrefslogtreecommitdiff
path: root/misdata.sci
blob: 5bd63405c44383014d5ff0eac944332bbb2f2946 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
function varargout = misdata(varargin)

// Recover Missing Data by Interpolation
// 
// Calling Sequence
// data = misdata(plantData)
// Parameters
// plantData : iddata type object with missing data as Nan
// data : iddata type object with interpolated data
// 
// Description
// misdata function recovers the experimental missing plant time series data by linear interpolation. 
// 
// Examples
// u = idinput(1024,'PRBS',[0 1/20],[-1 1])
// a = [1 0.2];b = [0 0.2 0.3];
// model = idpoly(a,b,'Ts',0.1)
// y = sim(u,model) + rand(length(u),1)
// u(100:105) = %nan;u(300:100:1000) = %nan
// y(420:422) = %nan;y(555:100:1024) = %nan
// plantData = iddata(y,u,0.1)
// data = misdata(plantData)
// 
// Authors
// Ashutosh Kumar Bhargava, Bhushan Manjarekar  


    [lhs,rhs] = argn(0)
// ------------------------------------------------------------------------------
//  checking the number of inputs
    if rhs <> 1 then
        error(msprintf(gettext("%s:Wrong number of input arguments.\n"),"misdata"))
    end
// ------------------------------------------------------------------------------
    ioData = varargin(1)
    if typeof(ioData) <> "iddata" then
        error(msprintf(gettext("%s: Plant input data must be ""iddata"" type. "),"misdata"))
    end
    inputMat = ioData.InputData;inputMat = linearINTRP(inputMat,abs(ioData.Ts));ioData.InputData = inputMat;
    outputMat = ioData.OutputData;outputMat = linearINTRP(outputMat,abs(ioData.Ts));ioData.OutputData = outputMat;
    varargout(1) = ioData
endfunction

function varargout = linearINTRP(matData,Ts)
    //  looking for overall nan values
    nanData = isnan(matData);nanIndex = find(nanData == %T)
    if ~size(nanIndex,'*') then
        varargout(1) = matData
    else
        tempMat = []
        matSize = size(matData,'r')
        //  looking for nan in each column 
        for ii = 1:size(matData,'c')
            nanData = isnan(matData(:,ii));nanIndex = find(nanData == %T);
            if ~size(nanData,'*') then
                tempMat = [tempMat matData(,ii)]
            else
                timeData = (linspace(1*Ts,matSize*Ts , matSize))';
                nanMat = isnan(matData(:,ii));
                data = matData(:,ii)
                data(nanMat) = interp1(timeData(~nanMat), data(~nanMat), timeData(nanMat));
                tempMat = [tempMat data]
            end
        end
        varargout(1) = tempMat
    end
endfunction