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)