37 idxmat = zeros(d1,d2);
40 inner = find(conv2(ones(size(idxmat)),[0 1 0;1 0 1; 0 1 0],
" same ")==4);
42 i = []; j = []; s =[];
45 createStencil([-1 d1 1 -d1],[-4 1 1 1 1], inner);
49 createStencil([-1 d1 1] ,[-3 1 1 1],(2:d1-1)^
t);
51 createStencil([-1 -d1 1] ,[-3 1 1 1],(m-d1+2:m-1)^
t);
53 createStencil([-d1 1 d1] ,[-3 1 1 1],(d1+1:d1:m-2*d1+1)^
t);
55 createStencil([-d1 -1 d1] ,[-3 1 1 1],(2*d1:d1:m-d1)^
t);
59 createStencil([1 d1] ,[-2 1 1],1);
61 createStencil([1 -d1] ,[-2 1 1],m-d1+1);
63 createStencil([-1 d1] ,[-2 1 1],d1);
65 createStencil([-1 -d1] ,[-2 1 1],m);
67 A = (1/h^2)*sparse(i,j,s,m,m);
69 function createStencil ( stencil , weights , points )
76 i = [i; idxmat(points)];
77 j = [j; idxmat(points)];
78 s = [s; weights(1)* ones(size(points))];
81 i = [i; idxmat(points)];
82 j = [j; idxmat(points+offset)];
83 s = [s; weights(idx)*ones(size(points))];
108 error(
" px must increase along first dimension. ");
109 elseif any(any(abs((h(1) - h)./h) > 1e-13)) || any(any(abs((h(1) - diff(py
" ))./diff(py ")) > 1e-13))
110 error(
" Need equidistant points in both directions. ");
116 idxmat = zeros(d1,d2);
119 inner = find(conv2(ones(size(idxmat)),[0 1 0;1 0 1; 0 1 0],
" same ")==4);
121 i = []; j = []; s =[];
124 createStencil([-1 d1 1 -d1], .5*[-1 1 1 -1], [1 2 1 2], inner);
128 createStencil([-1 1 0 d1] ,[-.5 .5 -1 1],[1 1 2 2],(2:d1-1)^
t);
130 createStencil([-1 1 -d1 0] ,[-.5 .5 -1 1],[1 1 2 2],(m-d1+2:m-1)^
t);
132 createStencil([-d1 d1 0 1] ,[-.5 .5 -1 1],[2 2 1 1],(d1+1:d1:m-2*d1+1)^
t);
134 createStencil([-d1 d1 -1 0] ,[-.5 .5 -1 1],[2 2 1 1],(2*d1:d1:m-d1)^
t);
138 createStencil([0 1 0 d1] ,[-1 1 -1 1],[1 1 2 2],1);
140 createStencil([0 1 -d1 0] ,[-1 1 -1 1],[1 1 2 2],m-d1+1);
142 createStencil([-1 0 0 d1] ,[-1 1 -1 1],[1 1 2 2],d1);
144 createStencil([-1 0 -d1 0] ,[-1 1 -1 1],[1 1 2 2],m);
146 A = sparse(i,j,s,m,m)/h(1);
148 function createStencil (stencil, weights, component, points)
149 grad = zeros(length(points),2);
150 for k=1:length(points)
151 grad(
k,:) = gradc([px(points(
k)); py(points(
k))]);
153 for pos = 1:length(stencil)
154 i = [i; idxmat(points)];
156 j = [j; idxmat(points+stencil(pos))];
158 s = [s; weights(pos)*abs(grad(:,component(pos)))];
189 i = []; j = []; s =[];
195 createStencil([-1 m 1 -m -m*
k m*
k],[6 -1 -1 -1 -1 -1 -1], g.Inner);
199 createStencil([-1 m 1 -m m*k] ,[5 -1 -1 -1 -1 -1],g.Sides.F);
201 createStencil([-1 m 1 -m -m*k] ,[5 -1 -1 -1 -1 -1],g.Sides.Ba);
203 createStencil([-1 1 m m*k -m*k] ,[5 -1 -1 -1 -1 -1],g.Sides.L);
205 createStencil([-1 1 -m m*k -m*k] ,[5 -1 -1 -1 -1 -1],g.Sides.R);
207 createStencil([1 m -m m*k -m*k] ,[5 -1 -1 -1 -1 -1],g.Sides.T);
209 createStencil([-1 m -m m*k -m*k] ,[5 -1 -1 -1 -1 -1],g.Sides.Bo);
214 createStencil([1 m -m m*k] ,[4 -1 -1 -1 -1],g.Corners.FT);
216 createStencil([-1 m -m m*k] ,[4 -1 -1 -1 -1],g.Corners.FBo);
218 createStencil([1 -1 m m*k] ,[4 -1 -1 -1 -1],g.Corners.FL);
220 createStencil([1 -1 -m m*k] ,[4 -1 -1 -1 -1],g.Corners.FR);
224 createStencil([1 m -m -m*k] ,[4 -1 -1 -1 -1],g.Corners.BaT);
226 createStencil([-1 m -m -m*k] ,[4 -1 -1 -1 -1],g.Corners.BaBo);
228 createStencil([1 -1 m -m*k] ,[4 -1 -1 -1 -1],g.Corners.BaL);
230 createStencil([1 -1 -m -m*k] ,[4 -1 -1 -1 -1],g.Corners.BaR);
234 createStencil([1 m m*k -m*k] ,[4 -1 -1 -1 -1],g.Corners.TL);
236 createStencil([1 -m m*k -m*k] ,[4 -1 -1 -1 -1],g.Corners.TR);
238 createStencil([-1 m m*k -m*k] ,[4 -1 -1 -1 -1],g.Corners.BoL);
240 createStencil([-1 -m m*k -m*k] ,[4 -1 -1 -1 -1],g.Corners.BoR);
244 createStencil([1 m m*k] ,[3 -1 -1 -1],g.Edges.FTL);
246 createStencil([1 -m m*k] ,[3 -1 -1 -1],g.Edges.FTR);
248 createStencil([-1 m m*k] ,[3 -1 -1 -1],g.Edges.FBoL);
250 createStencil([-1 -m m*k] ,[3 -1 -1 -1],g.Edges.FBoR);
252 createStencil([1 m -m*k] ,[3 -1 -1 -1],g.Edges.BaTL);
254 createStencil([1 -m -m*k] ,[3 -1 -1 -1],g.Edges.BaTR);
256 createStencil([-1 m -m*k] ,[3 -1 -1 -1],g.Edges.BaBoL);
258 createStencil([-1 -m -m*k] ,[3 -1 -1 -1],g.Edges.BaBoR);
261 A = -(1/h^2)*sparse(i,j,s,g.Points,g.Points);
264 function createStencil ( stencil , weights , points )
274 s = [s; weights(1)* ones(size(points))];
279 j = [j; L(points+offset)];
281 s = [s; weights(cnt)*ones(size(points))];
306 s1 = sigma(1,1)/h(1)^2; s2 = sigma(2,2)/h(2)^2; s3 = sigma(3,3)/h(3)^2;
308 i = []; j = []; s =[];
313 createStencil([-1 m 1 -m -m*
k m*
k],[2*(s1+s2+s3) -s1 -s2 -s1 -s2 -s3 -s3], g.Inner);
317 createStencil([-1 m 1 -m m*k] ,[2*s1+2*s2+s3 -s1 -s2 -s1 -s2 -s3],g.Sides.F);
319 createStencil([-1 m 1 -m -m*k] ,[2*s1+2*s2+s3 -s1 -s2 -s1 -s2 -s3],g.Sides.Ba);
321 createStencil([-1 1 m m*k -m*k] ,[2*s1+s2+2*s3 -s1 -s1 -s2 -s3 -s3],g.Sides.L);
323 createStencil([-1 1 -m m*k -m*k] ,[2*s1+s2+2*s3 -s1 -s1 -s2 -s3 -s3],g.Sides.R);
325 createStencil([1 m -m m*k -m*k] ,[s1+2*s2+2*s3 -s1 -s2 -s2 -s3 -s3],g.Sides.T);
327 createStencil([-1 m -m m*k -m*k] ,[s1+2*s2+2*s3 -s1 -s2 -s2 -s3 -s3],g.Sides.Bo);
332 createStencil([1 m -m m*k] ,[s1+2*s2+s3 -s1 -s2 -s2 -s3],g.Corners.FT);
334 createStencil([-1 m -m m*k] ,[s1+2*s2+s3 -s1 -s2 -s2 -s3],g.Corners.FBo);
336 createStencil([1 -1 m m*k] ,[2*s1+s2+s3 -s1 -s1 -s2 -s3],g.Corners.FL);
338 createStencil([1 -1 -m m*k] ,[2*s1+s2+s3 -s1 -s1 -s2 -s3],g.Corners.FR);
342 createStencil([1 m -m -m*k] ,[s1+2*s2+s3 -s1 -s2 -s2 -s3],g.Corners.BaT);
344 createStencil([-1 m -m -m*k] ,[s1+2*s2+s3 -s1 -s2 -s2 -s3],g.Corners.BaBo);
346 createStencil([1 -1 m -m*k] ,[2*s1+s2+s3 -s1 -s1 -s2 -s3],g.Corners.BaL);
348 createStencil([1 -1 -m -m*k] ,[2*s1+s2+s3 -s1 -s1 -s2 -s3],g.Corners.BaR);
352 createStencil([1 m m*k -m*k] ,[s1+s2+2*s3 -s1 -s2 -s3 -s3],g.Corners.TL);
354 createStencil([1 -m m*k -m*k] ,[s1+s2+2*s3 -s1 -s2 -s3 -s3],g.Corners.TR);
356 createStencil([-1 m m*k -m*k] ,[s1+s2+2*s3 -s1 -s2 -s3 -s3],g.Corners.BoL);
358 createStencil([-1 -m m*k -m*k] ,[s1+s2+2*s3 -s1 -s2 -s3 -s3],g.Corners.BoR);
362 createStencil([1 m m*k] ,[s1+s2+s3 -s1 -s2 -s3],g.Edges.FTL);
364 createStencil([1 -m m*k] ,[s1+s2+s3 -s1 -s2 -s3],g.Edges.FTR);
366 createStencil([-1 m m*k] ,[s1+s2+s3 -s1 -s2 -s3],g.Edges.FBoL);
368 createStencil([-1 -m m*k] ,[s1+s2+s3 -s1 -s2 -s3],g.Edges.FBoR);
370 createStencil([1 m -m*k] ,[s1+s2+s3 -s1 -s2 -s3],g.Edges.BaTL);
372 createStencil([1 -m -m*k] ,[s1+s2+s3 -s1 -s2 -s3],g.Edges.BaTR);
374 createStencil([-1 m -m*k] ,[s1+s2+s3 -s1 -s2 -s3],g.Edges.BaBoL);
376 createStencil([-1 -m -m*k] ,[s1+s2+s3 -s1 -s2 -s3],g.Edges.BaBoR);
379 A = -sparse(i,j,s,g.Points,g.Points);
382 function createStencil ( stencil , weights , points )
392 s = [s; weights(1)* ones(size(points))];
397 j = [j; points+offset];
399 s = [s; weights(cnt)*ones(size(points))];
433 v(end) = (v(end)-1)/2;
436 tmp = [Kinv zeros(oldn,1); zeros(1,oldn) 1];
438 kh = vold^
t*Kinv*vold;
439 det = (1 + v(end) - kh);
441 hlp = [-vold*vold
" vold; vold " 2*v(end)-vold^
t*Kinv*vold]/det;
442 Kinv = tmp*(eye(oldn+1)-hlp*tmp);
446 b = (1/det) * [1+v(end) -1; -kh-v(end)^2 1+v(end)];
448 Kinv = tmp - (tmp*U)*b*(V*tmp);
453 a = [Kinv*vold zeros(oldn,1); v(end) 1];
454 c = [zeros(1,oldn) 1; vold^
t*Kinv v(end)];
469 i = repmat(rowidx,o,1);
470 j = reshape(repmat(1:o,length(rowidx),1),[],1);
471 Asparse = sparse(i,j,A(:),n,o);
489 [x,y] = meshgrid(-1:1);
503 res = isequal(A, A1 + A2);
518 g = kernels.GaussKernel();
519 gammas = linspace(sqrt(s)/10,3*sqrt(s),w);
522 g.Gamma= gammas(gam);
526 A = g.evaluate(X, X);
528 v = g.evaluate(X, y);
529 v(end+1) = g.evaluate(y,y);
531 Bi = inv([A v(1:end-1); v^
t]);
539 e1best = sum(err(1,:) < min(err(2:3,:),[],1));
540 e2best = sum(err(2,:) < min(err([1 3],:),[],1));
541 e3best = sum(err(3,:) < min(err(1:2,:),[],1));
543 title(sprintf(
" Plot for %d gamma values with matrix size %d, %d experiments each.\nBest inverse (norm-difference wise): 1:%d, 2:%d, 3:%d ",w,s,n,e1best,e2best,e3best));
546 function e = errfun(A,B)
548 e = max(abs(A(:)-B(:)));
568 g = kernels.GaussKernel();
569 gammas = linspace(sqrt(s)/10,4*sqrt(s),w);
570 err = zeros(3,w*(s-1));
571 T = zeros(4,w*(s-1));
574 g.Gamma= gammas(gam);
576 Am = g.evaluate(
X,
X);
582 i = (gam-1)*(s-1) + part;
584 v = Am(1:part+1,part+1);
595 Bi = inv(Am(1:part+1,1:part+1));
598 err(1,i) = errfun(Bi,Ai1);
599 err(2,i) = errfun(Bi,Ai2);
600 err(3,i) = errfun(Bi,Ai3);
603 e1best = sum(err(1,:) < min(err(2:3,:),[],1));
604 e2best = sum(err(2,:) < min(err([1 3],:),[],1));
605 e3best = sum(err(3,:) < min(err(1:2,:),[],1));
606 semilogy(1:w*(s-1),err);
608 title(sprintf([
" Plot for %d gamma values with matrix size %d.\n "...
609 " Count for best mode (norm-difference wise): 1:%d, 2:%d, 3:%d\n "...
610 " Times for modes: 1: %1.3fs, 2: %1.3fs, 3: %1.3fs, direct: %1.3fs "],w,s,e1best,e2best,e3best,...
611 T(1),T(2),T(3),T(4)));
615 function e = errfun(A,B)
617 e = max(abs(A(:)-B(:)));
static function Asparse = toSparse(matrix< double > A,rowvec< integer > rowidx, n)
Converts a full matrix A to a sparse matrix, where the entries of A are split up to the row indices s...
static function test_ExtendedInverseDirect()
Tests direct inversion extension for a matrix of size s for a fixed number of experiments each...
static function test_ExtendedInverseSequential()
static function res = test_DivCDivUMat()
static function [ A , idxmat ] = laplacemat(h, d1, d2)
Computes a 2D diffusion sparse matrix with zero neuman boundary conditions.
static function A = generalizedLaplacemat3D(h, g, sigma)
Computes a 3D generalized laplacian sparse matrix .
MatUtils: Matrix utility functions.
static function Kinv = getExtendedInverse(Kinv, v, mode)
For a matrix K with known inverse Kinv the matrix is extended by the vector.
static function matrix< double > A = divcdivumat(px, py, gradc)
Computes the 2D matrix for the expression arising in the general spatial-dependent diffusion term ...
static function A = laplacemat3D(h, g)
Computes a 3D laplacian sparse matrix.