## Variable precision QR decomposition in MATLAB

Someone recently contacted me complaining that MATLAB could not do a QR factorisation of a variable precision arithmetic matrix. Double precision matrices work fine of course:

>> A=[2 1 3;-1 0 7; 0 -1 -1]; >> [Q R]=qr(A) Q = -0.8944 -0.1826 0.4082 0.4472 -0.3651 0.8165 0 0.9129 0.4082 R = -2.2361 -0.8944 0.4472 0 -1.0954 -4.0166 0 0 6.5320

Variable precision matrices do not (I’m using MATLAB 2012a and the symbolic toolbox here).

>> a=vpa([2 1 3;-1 0 7; 0 -1 -1]); >> [Q R]=qr(a) Undefined function 'qr' for input arguments of type 'sym'.

It turns out that MATLAB and the symbolic toolbox CAN do variable precision QR factorisation….it’s just hidden a bit. The following very simple function, vpa_qr.m, shows how to get at it

function [ q,r ] = vpa_qr( x ) result = feval(symengine,'linalg::factorQR',x); q=result(1); r=result(2); end

Let’s see how that does

>> a=vpa([2 1 3;-1 0 7; 0 -1 -1]); >> [Q R]=vpa_qr(a);

I’ve suppressed the output because it’s so large but it has definitely worked. Let’s take a look at the first element of Q for example

>> Q(1) ans = 0.89442719099991587856366946749251

Which is correct to the default number of variable precision digits, 32. Of course we could change this to anything we like using the digits function.

- Download vpa_qr.m (needs symbolic toolbox)