84 lines
3.3 KiB
Mathematica
84 lines
3.3 KiB
Mathematica
|
% function [Catalog] = CatalogSelectRange(fullcatalog,...)
|
||
|
% Select lines/values from catalog
|
||
|
% Input parameters are pairs:
|
||
|
% names of fields
|
||
|
% and
|
||
|
% range of values
|
||
|
% for numeric there are: [minval maxval] or [val] or {val1, val2, val3, ...}
|
||
|
% for strings there are: 'valtext' or {'valtext1', 'valtext2', 'valtext3', ...}
|
||
|
% eg. CatalogSelectRange(fullcatalog,'Mw',[0 4.5])
|
||
|
%
|
||
|
% (c) Jan Wiszniowski IG PAS
|
||
|
% Modyfied 2016.02.04 - numerical comparison with tolerance 1e-14
|
||
|
|
||
|
function [Catalog] = CatalogSelectRange(fullcatalog,varargin)
|
||
|
Catalog = fullcatalog ;
|
||
|
range = true(size(fullcatalog(1).val)) ;
|
||
|
na_varargin = numel(varargin) ;
|
||
|
for i= 1:2:na_varargin-1
|
||
|
if ~ischar(varargin{i})
|
||
|
warning(['Wrong type of parameter ' num2str(i)])
|
||
|
continue
|
||
|
end
|
||
|
index = find(strcmp(varargin{i},{fullcatalog.field})) ;
|
||
|
if length(index) ~= 1
|
||
|
warning(['Can not select field ' varargin{i}])
|
||
|
continue
|
||
|
end
|
||
|
if fullcatalog(index).type == 3
|
||
|
lrange = varargin{i+1} ;
|
||
|
if ischar(lrange)
|
||
|
range = range & strcmp(lrange,fullcatalog(index).val) ;
|
||
|
elseif iscell(lrange)
|
||
|
l_range = false(size(range)) ;
|
||
|
for j = 1:numel(lrange)
|
||
|
llrange = lrange{j} ;
|
||
|
if ischar(llrange)
|
||
|
l_range = l_range | strcmp(llrange,fullcatalog(index).val) ;
|
||
|
end
|
||
|
end
|
||
|
range = range & l_range ;
|
||
|
else
|
||
|
warning(['Wrong type of walues for parameter ' varargin{i}])
|
||
|
end
|
||
|
else
|
||
|
lrange = varargin{i+1} ;
|
||
|
nnel = numel(lrange) ;
|
||
|
if isnumeric(lrange)
|
||
|
tol = abs(lrange) ./ 1e15 ;
|
||
|
if nnel == 2
|
||
|
range = range & fullcatalog(index).val >= lrange(1)-tol(1) & fullcatalog(index).val <= lrange(2)+tol(2) ;
|
||
|
elseif nnel == 1
|
||
|
range = range & abs(fullcatalog(index).val - lrange(1)) <= tol(1) ;
|
||
|
end
|
||
|
elseif iscell(lrange)
|
||
|
l_range = false(size(range)) ;
|
||
|
for j = 1:numel(lrange)
|
||
|
llrange = lrange{j} ;
|
||
|
tol = abs(llrange) ./ 1e15 ;
|
||
|
if isnumeric(llrange)
|
||
|
if numel(llrange) == 2
|
||
|
l_range = l_range | fullcatalog(index).val >= llrange(1)-tol(1) & fullcatalog(index).val <= llrange(2)+tol(2) ;
|
||
|
elseif numel(llrange) == 1
|
||
|
l_range = l_range | abs(range & fullcatalog(index).val - llrange(1)) <= tol(1);
|
||
|
end
|
||
|
else
|
||
|
warning(['Wrong type of walues for parameter ' varargin{i}])
|
||
|
end
|
||
|
end
|
||
|
range = range & l_range ;
|
||
|
else
|
||
|
warning(['Wrong type of walues for parameter ' varargin{i}])
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
for i = 1:numel(fullcatalog)
|
||
|
if fullcatalog(i).type == 3
|
||
|
Catalog(i).val = {fullcatalog(i).val{range}}' ;
|
||
|
else
|
||
|
Catalog(i).val = fullcatalog(i).val(range) ;
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|