def __init__(self, Q, index, Q_time_var_index, unique_Q_number, dQ=None):
self.Q = Q<EOL>self.index = np.asarray(index, np.int_)<EOL>self.Q_time_var_index = Q_time_var_index<EOL>self.dQ = dQ<EOL>if (len(np.unique(index)) > unique_Q_number):<EOL><INDENT>self.svd_each_time = True<EOL><DEDENT>else:<EOL><INDENT>self.svd_each_time = False<EOL><DEDENT>self.Q_square_root = {}<EOL>
Input:
---------------
R - array with noise on various steps. The result of preprocessing
    the noise input.

index - for each step of Kalman filter contains the corresponding index
        in the array.

R_time_var_index - another index in the array R. Computed earlier and
                    passed here.

unique_R_number - number of unique noise matrices below which square
    roots are cached and above which they are computed each time.

dQ: 3D array[:, :, param_num]
    derivative of Q. Derivative is supported only when Q do not
    change over time

Output:
--------------
Object which has two necessary functions:
    f_R(k)
    inv_R_square_root(k)