74 lines
2.0 KiB
Mathematica
74 lines
2.0 KiB
Mathematica
|
|
function Y=diff(varargin)
|
||
|
|
%DIFF (overloaded)
|
||
|
|
|
||
|
|
X = varargin{1};
|
||
|
|
n = X.dim(1);
|
||
|
|
m = X.dim(2);
|
||
|
|
|
||
|
|
switch nargin
|
||
|
|
case 1
|
||
|
|
if n == 1
|
||
|
|
% Default is diff along first dimension, unless we only have
|
||
|
|
% one row. This happens to be the case in which the core function operates
|
||
|
|
Y = differ(X);
|
||
|
|
else
|
||
|
|
% MATLAB stadnard, just diff along first dimension. Reuse core
|
||
|
|
% code by transposing matrix
|
||
|
|
Y = differ(X')';
|
||
|
|
end
|
||
|
|
return
|
||
|
|
|
||
|
|
case 2
|
||
|
|
% Note that MATLAB diff(randn(2,4),2) will cause a diff in two
|
||
|
|
% different directions.
|
||
|
|
if n == 1
|
||
|
|
if varargin{2}==1 || isempty(varargin{2})
|
||
|
|
Y = differ(X);
|
||
|
|
else
|
||
|
|
% Recursive use
|
||
|
|
Y = diff(differ(X),varargin{2}-1);
|
||
|
|
end
|
||
|
|
else
|
||
|
|
if varargin{2}==1 || isempty(varargin{2})
|
||
|
|
Y = differ(X')';
|
||
|
|
else
|
||
|
|
% Recursive use
|
||
|
|
Y = diff(differ(X')',varargin{2}-1);
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
case 3
|
||
|
|
if X.dim(varargin{3})-varargin{2} <=0
|
||
|
|
dim = X.dim;
|
||
|
|
dim(varargin{3}) = 0;
|
||
|
|
Y = zeros(dim);
|
||
|
|
elseif varargin{2}==1
|
||
|
|
if varargin{3} == 2
|
||
|
|
Y = differ(X);
|
||
|
|
elseif varargin{3} == 1 || isempty(varargin{3})
|
||
|
|
Y = differ(X')';
|
||
|
|
end
|
||
|
|
elseif varargin{2} > 1
|
||
|
|
% Recursive call for higher-order diff
|
||
|
|
Y = diff(diff(X,varargin{2}-1,varargin{3}),1,varargin{3});
|
||
|
|
return
|
||
|
|
end
|
||
|
|
otherwise
|
||
|
|
error('To many input arguments.')
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
function Y = differ(X)
|
||
|
|
|
||
|
|
n = X.dim(1);
|
||
|
|
m = X.dim(2);
|
||
|
|
Y = X;
|
||
|
|
shift = [-speye(m-1) spalloc(m-1,1,0)] + [spalloc(m-1,1,0) speye(m-1)];
|
||
|
|
shift = kron(shift,speye(n));
|
||
|
|
Y.basis = shift*X.basis;
|
||
|
|
Y.dim(1) = n;
|
||
|
|
Y.dim(2) = m - 1;
|
||
|
|
% Reset info about conic terms
|
||
|
|
Y.conicinfo = [0 0];
|
||
|
|
Y = flush(Y);
|
||
|
|
Y = clean(Y);
|