wolffd@0: function [F,H,Q,R,initx, initV] = AR_to_SS(coef, C, y) wolffd@0: % wolffd@0: % Convert a vector auto-regressive model of order k to state-space form. wolffd@0: % [F,H,Q,R] = AR_to_SS(coef, C, y) wolffd@0: % wolffd@0: % X(i) = A(1) X(i-1) + ... + A(k) X(i-k+1) + v, where v ~ N(0, C) wolffd@0: % and A(i) = coef(:,:,i) is the weight matrix for i steps ago. wolffd@0: % We initialize the state vector with [y(:,k)' ... y(:,1)']', since wolffd@0: % the state vector stores [X(i) ... X(i-k+1)]' in order. wolffd@0: wolffd@0: [s s2 k] = size(coef); % s is the size of the state vector wolffd@0: bs = s * ones(1,k); % size of each block wolffd@0: wolffd@0: F = zeros(s*k); wolffd@0: for i=1:k wolffd@0: F(block(1,bs), block(i,bs)) = coef(:,:,i); wolffd@0: end wolffd@0: for i=1:k-1 wolffd@0: F(block(i+1,bs), block(i,bs)) = eye(s); wolffd@0: end wolffd@0: wolffd@0: H = zeros(1*s, k*s); wolffd@0: % we get to see the most recent component of the state vector wolffd@0: H(block(1,bs), block(1,bs)) = eye(s); wolffd@0: %for i=1:k wolffd@0: % H(block(1,bs), block(i,bs)) = eye(s); wolffd@0: %end wolffd@0: wolffd@0: Q = zeros(k*s); wolffd@0: Q(block(1,bs), block(1,bs)) = C; wolffd@0: wolffd@0: R = zeros(s); wolffd@0: wolffd@0: initx = zeros(k*s, 1); wolffd@0: for i=1:k wolffd@0: initx(block(i,bs)) = y(:, k-i+1); % concatenate the first k observation vectors wolffd@0: end wolffd@0: wolffd@0: initV = zeros(k*s); % no uncertainty about the state (since perfectly observable)