function An = slnorm(A, p, d)
%SLNORM Compute the Lp-norms
%
% $ Syntax $
% - An = slnorm(A)
% - An = slnorm(A, p)
% - An = slnorm(A, [], d)
% - An = slnorm(A, p, d)
%
% $ Arguments $
% - A: the input array
% - p: the order of the norm (default = 2)
% - d: the dimension of subarrays (default = 1, column vectors)
% - An: the resultant array
%
% $ Description $
% - An = slnorm(A) computes the L2 norm of column vectors of A. If A is
% an array of size d1 x d2 x ... dn, then An would be of size
% 1 x d2 x ... dn. Each value of An is the L2 norm of corresponding
% column vector.
%
% - An = slnorm(A, p) computes the Lp norm of column vectors of A. If A
% is an array of size d1 x d2 x ... dn, then An would be of size
% 1 x d2 x ... dn. Each value of An is the Lp norm of corresponding
% column vector.
%
% - An = slnorm(A, [], d) computes the L2 norm of sub-arrays along the
% dimensions specified by d. For example, if A is a d1 x d2 x ... dn
% array, and d = [1, 2], then An would be an array of size
% 1 x 1 x d3 x ... x dn. Each value of An is the square root of square-
% sum of values in corresponding plane.
%
% - An = slnorm(A, p, d) computes the Lp norm of sub-arrays along the
% dimensions specified by d.
%
% $ Remarks $
% # Lp norm is the pth order-root of the sum of p-th power of all values
% in a subspace.
% # p can be inf or -inf. If p = inf, then the Lp norm is simply the
% maximum magnitude value; while if p = -inf, then the Lp norm is the
% minimum magnitude value.
%
% $ History $
% - Created by Dahua Lin on Nov 19th, 2005
%
%% parse and verify input arguments
if nargin < 2 || isempty(p)
p = 2;
end
if nargin < 3 || isempty(d)
d = 1;
end
if ~isscalar(p)
error('sltoolbox:notscalar', 'p should be a scalar');
end
if p == 0
error('sltoolbox:zeroerr', 'p should not be zero');
end
%% compute
An = abs(A);
if p == 1
An = slsum(An, d);
elseif p == 2
An = sqrt(slsum(An .* An ,d));
elseif p == inf
An = slmax(An, d);
elseif p == (-inf)
An = slmin(An, d);
else
An = slsum(An.^p, d) .^ (1/p);
end