In any programming language printing "Hello World" is always a first example. Here we display "Hello" using Chebfun2. Can you adapt it to display "Hello World" instead?
Here is a matrix that encodes the word "Hello", from Exercise 9.3 of [1].
A=zeros(15,40); A(2:9,2:3)=1; A(5:6,4:5)=1;A(2:9,6:7)=1; A(3:10,10:11)=1; A(3:4,10:15)=1; A(6:7,10:15)=1; A(9:10,10:15)=1; A(4:11,18:19)=1; A(10:11,18:24)=1; A(5:12,26:27)=1; A(11:12,26:31)=1; A(6:13,34:35)=1; A(6:13,38:39)=1; A(6:7,36:37)=1; A(12:13,36:37)=1; spy(A)
The matrix is of size $15\times 40$ and hence of rank at most 15. Actually it is of rank 10 because there are five zero rows:
rank(A)
ans = 10
Constructing a chebfun2 from discrete data
Usually Chebfun2 is passed a function of two variables, but it can also deal with discrete data such as a matrix, with syntax such as chebfun2(A)
. The matrix $A$, of size $m\times n$, is assumed to contain data values of a function sampled on an $m\times n$ Chebyshev tensor grid, and the resulting chebfun2 interpolates $A$. For example:
f = chebfun2(A); % chebfun2 X = chebpolyval2(f); % evaluate on a grid norm(A - X) % interpolation error
ans = 2.657492966402851e-15
Saying Hello
We can also pass the Chebfun2 constructor an integer $k$ so that the resulting chebfun2 is of rank exactly $k$. Here is one way to say "Hello":
m = 200; x = linspace(-1,1,m); [xx yy]=meshgrid(x); [ss tt]=chebfun2.chebpts2(m); B = flipud(A); % flip because of matrix indexing for k = [1 3 5 7 10] f = chebfun2(B,k); X = f(ss,tt); contour(xx,yy,X,.1:.1:.99), axis off title(sprintf('Rank %u',k),'fontsize',16) pause(.1) snapnow end
References
- L. N. Trefethen and D. Bau III, Numerical Linear Algebra, SIAM, 1997.