0001 function [fx,fy,fz] = grad(M, options)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021 options.null = 0;
0022 bound = getoptions(options, 'bound', 'sym');
0023 order = getoptions(options, 'order', 1);
0024
0025
0026
0027 nbdims = 2;
0028 if size(M,1)==1 || size(M,2)==1
0029 nbdims = 1;
0030 end
0031 if size(M,1)>1 && size(M,2)>1 && size(M,3)>1
0032 nbdims = 3;
0033 end
0034
0035
0036 if strcmp(bound, 'sym')
0037 if order==1
0038 fx = M([2:end end],:,:)-M;
0039 else
0040 fx = ( M([2:end end],:,:)-M([1 1:end-1],:,:) )/2;
0041
0042 fx(1,:,:) = M(2,:,:)-M(1,:,:);
0043 fx(end,:,:) = M(end,:,:)-M(end-1,:,:);
0044 end
0045 if nbdims>=2
0046 if order==1
0047 fy = M(:,[2:end end],:)-M;
0048 else
0049 fy = ( M(:,[2:end end],:)-M(:,[1 1:end-1],:) )/2;
0050
0051 fy(:,1,:) = M(:,2,:)-M(:,1,:);
0052 fy(:,end,:) = M(:,end,:)-M(:,end-1,:);
0053 end
0054 end
0055 if nbdims>=3
0056 if order==1
0057 fz = M(:,:,[2:end end])-M;
0058 else
0059 fz = ( M(:,:,[2:end end])-M(:,:,[1 1:end-1]) )/2;
0060
0061 fz(:,:,1) = M(:,:,2)-M(:,:,1);
0062 fz(:,:,end) = M(:,:,end)-M(:,:,end-1);
0063 end
0064 end
0065 else
0066 if order==1
0067 fx = M([2:end 1],:,:)-M;
0068 else
0069 fx = ( M([2:end 1],:,:)-M([end 1:end-1],:,:) )/2;
0070 end
0071 if nbdims>=2
0072 if order==1
0073 fy = M(:,[2:end 1],:)-M;
0074 else
0075 fy = ( M(:,[2:end 1],:)-M(:,[end 1:end-1],:) )/2;
0076 end
0077 end
0078 if nbdims>=3
0079 if order==1
0080 fz = M(:,:,[2:end 1])-M;
0081 else
0082 fz = ( M(:,:,[2:end 1])-M(:,:,[end 1:end-1]) )/2;
0083 end
0084 end
0085 end
0086
0087 if nargout==1
0088 if nbdims==2
0089 fx = cat(3,fx,fy);
0090 elseif nbdims==3
0091 fx = cat(4,fx,fy,fz);
0092 end
0093 end