⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 l_curve.m

📁 matlab源代码
💻 M
字号:
function wlog=l_curve(wlog,action,mnem,values,units,description)
% Function manipulates curve(s) of a log structure
% Written by: E. R.: May 12, 2000
% Last updated: November 8, 2004: update also field "curve_types (if it exists).                
%
%          wlog=l_curve(wlog,action,mnem,values,units,description)
%          wlog=l_curve(wlog,action,mnem)   for action=delete,delete_ne,keep,keep_ne,slist
%          wlog=l_curve(wlog)               assumes action list
% INPUT
% wlog      log structure;
%              If this is the only input argument, "action" is set to 'slist' and "mnem' is
%              set to '*'. The function prints a list of all curve values as described 
%              below. 
% action       Defines action to take. Possible values are:
%              'add'      Add curve with mnemonic mnem. Gives error message if 
%                         curve already exists
%              'add_ne'   Add curve with mnemonic mnem. Replaces it if it already exists.
%              'replace'  Replaces curve with mnemonic mnem; error if curve does not
%                         exist; original units and description are retained if not given
%              'delete'   Delete curve(s) with mnemonic(s) mnem; 
%                         error if any of the curves do not exist 
%              'delete_ne' Delete curve(s) with mnemonic(s) mnem if the curve is (curves are)
%                         present; no error if one or more of the curve(s) specified 
%                         does not exist 
%              'keep'     Keep curve(s) with mnemonic(s) mnem and deletes all others;
%                         error if one or more of the curve(s) do not exist 
%              'keep_ne'  Keep curve(s) with mnemonic(s) mnem if it is (they are) present
%                         and deletes all others; no error if any or all curves specified 
%                         are not present
%              'rename'   Rename curve mnemonic, keep everything else the same
%              'list'     Print short list: for specified curve mnemonic(s): it lists minimum 
%                         and maximum value, number of gaps (null values) between first and 
%                         last non-null value, total number of missing samples (null values),
%                         units of measurement, and curve description
%              
%          The other input parameters depend on the parameter "action"
%                   CASE action = 'add', 'add_ne', or 'replace'
% mnem         curve mnemonic
% values       curve values
%              if only one value is given the curve is assumed to be constant
% units        Units of measurement for curve values (optional if 'action' is 'replace')
% description  Description of curve mnemonic (optional if 'action' is 'replace')
%              If "action" is 'replace' "units" and "description" need not be given; 
%              in this case the original "units" and "description" are retained.
%
%                CASE action = 'delete', delete_ne', 'keep', 'keep_ne', or 'list'
% mnem         curve mnemonic or cells array with curve mnemonics
%              '*' means all curves
%
%                CASE action = 'rename'
% mnem         Cell array consisting of two strings: the old and 
%              the new name of the curve
%
% OUTPUT
% wlog      "Updated" log structure (log structure is unchanged if action == 'list')
              
if nargin < 1
  error('At least one input argument (log structure) required')
end

if ~isstruct(wlog)
  error('The first input argument must be a log structure')
end

if nargin == 1
  action='list';
  mnem={'*'};
else
  action=lower(action);
  if ~iscell(mnem)
    mnem={mnem};
  end
end
% mnem=lower(mnem);

[mh,nh]=size(wlog.curves);

lmnem=length(mnem);
if lmnem == 1 & strcmp(char(mnem),'*') & ...
   ~strcmp(action,'add') & ~strcmp(action,'add_ne') & ~strcmp(action,'replace')
  mnem=wlog.curve_info(:,1);
  lmnem=length(mnem);
end

switch action
               case {'add','add_ne','replace'}

lv=length(values);
if lv == 1
  val=values ; 
elseif lv == mh
  val=reshape(values,mh,1);
else
  error(['Input argument "values" must be a constant or a vector ', ...
         'whose length is equal to the number of samples in the log structure'])
end

if ~isfield(wlog,'curve_info')
  error([' Field ''curve_info'' is missing from log structure "',inputname(1),'"'])
else
  [idx,ier]=curve_index1(wlog,char(mnem));
end
if ~isempty(idx)
   if strcmpi(action,'add')
     error(['The curve mnemonic ',char(mnem),' already exists in the log'])
   else
     wlog.curves(:,idx)=val;
     if strcmpi(action,'replace') & nargin <= 4
       disp([' Original units of measurement and description of "',char(mnem),'" retained'])
     else
       wlog.curve_info(idx,2)={units};
       wlog.curve_info(idx,3)={description};
     end
   end
   if idx == 1   % Depth column replaced; create new fields "first", "last", "step"
     wlog.first=wlog.curves(1,1);
     wlog.last=wlog.curves(end,1);
     dd=diff(wlog.curves(:,1));
     madd=max(dd);
     midd=min(dd);
     if midd <= 0
        disp(' Alert from "l_curve": Depth column should be monotonicly increasing')
     end
     if madd-midd > 1.0e6*eps*(wlog.curves(end,1)-wlog.curves(1,1))/mh;
       wlog.step=(madd+midd)*0.5;
     else
       wlog.step=0;
     end
   end 
      
else
  if strcmpi(action,'replace')
    error(['The curve mnemonic ',char(mnem),' does not exist in the log'])
  else
    idx=nh+1;
    wlog.curve_info(idx,1)=mnem;
    wlog.curves(:,idx)=val;
    wlog.curve_info(idx,2)={units};
    wlog.curve_info(idx,3)={description};
  end      
end

              case {'delete','delete_ne'}
lmnem=length(mnem);
for ii=1:lmnem
  if strcmpi(action,'delete');
    idx=curve_index1(wlog,mnem{ii});
  else
    [idx,ier]=curve_index1(wlog,mnem{ii});
  end
  if length(idx) > 0
    if length(idx) == length(wlog.curve_info(:,1))
      wlog=rmfield(wlog,{'curves','curve_mnem','curve_units','curve_descriptions'});
    else
      wlog.curves(:,idx)=[];
      wlog.curve_info(idx,:)=[];
    end
  end
end 
if isfield(wlog,'curve_types')
   bool=ismember(lower(wlog.curve_types(:,1)),lower(mnem));
   wlog.curve_types(bool,:)=[];
end

              case {'keep','keep_ne'}
idx=find(~ismember(lower(wlog.curve_info(2:end,1)),lower(mnem)))+1;
if lmnem ~= nh-length(idx)-1 & strcmp(action,'keep')
  for ii=1:lmnem
    if ~ismember(lower(wlog.curve_info(:,1)),lower(mnem(ii)))
       disp([' Curve "',char(mnem(ii)),'" does not exist in the log'])
    end
  end
  %keyboard
  error(' Abnormal termination')
end
if length(idx) == nh
   wlog=rmfield(wlog,{'curves','curve_info'});
else
   wlog.curves(:,idx)=[];
   wlog.curve_info(idx,:)=[];
end 
if isfield(wlog,'curve_types')
   bool=ismember(lower(wlog.curve_types(:,1)),lower(mnem));
   temp=wlog.curve_types(bool,:);
   if ~isempty(temp)
      wlog.curve_types=temp;
   end
end

              case 'rename'
if lmnem ~= 2
  error(['Parameter "mnem" must be a cell array with two strings' , ... 
        '(old curve mnemonic and new curve mnemonic)'])
elseif ismember(lower(wlog.curve_info(:,1)),lower(mnem(2)))
  error(['New curve mnemonic ',char(mnem(2)),' already exists in the log'])
else
   idx=find(ismember(lower(wlog.curve_info(:,1)),lower(mnem(1))));
   if isempty(idx)
      error([' Log curve ',char(mnem(1)),' does not exist'])
   else
      wlog.curve_info(idx,1)=mnem(2);
   end
end
if isfield(wlog,'curve_types')
   idx=find(ismember(lower(wlog.curve_types(:,1)),lower(mnem{1})));
   if ~isempty(idx)
      wlog.curve_types(idx,1)=mnem{2};
   end
end


              case 'list'
idx=find(ismember(lower(wlog.curve_info(:,1)),lower(mnem)));
if isempty(idx)
  error([' Log curve(s) "',cell2str(mnem,'", "'),'" do(es) not exist'])
end
mnems=char('MNEMONIC',wlog.curve_info{idx,1});
descr=char('DESCRIPTION',wlog.curve_info{idx,3});
units=char('UNITS',wlog.curve_info{idx,2});
hmin=min(wlog.curves(:,idx))';
hmax=max(wlog.curves(:,idx))';

%    Compute number of gaps and total number of NaNs in each curve
lidx=length(idx);
gaps=zeros(lidx,1);
nnans=zeros(lidx,1);

for ii=1:lidx
  idxnan=find(~isnan(wlog.curves(:,idx(ii))));
  if length(idxnan) > 1
    didx=diff(idxnan);
    gaps(ii)=sum(didx > 1);
    nnans(ii)=mh-length(idxnan);
  end
end
  
spaces(1:length(hmax)+1)=' ';

shmin=char('MIN_VAL',num2str(hmin));
shmax=char('MAX_VAL',num2str(hmax));
sgaps=char('GAPS',num2str(gaps));
snans=char('NaNs',num2str(nnans));
if ~isempty(inputname(1))
   disp(['Curves of log structure "',inputname(1),'"'])
end

disp([mnems,spaces',shmin,spaces',spaces',shmax,spaces', ...
      spaces',sgaps,spaces',snans,spaces',units,spaces',descr]);

%   Write message if one or more of the curves specified were not found
if lmnem ~= length(idx)    
  for ii=1:lmnem
    if ~ismember(lower(wlog.curve_info(:,1)),lower(mnem(ii)))
      disp([char(mnem(ii)),' is not present'])
    end
  end
end

ier=l_check(wlog);
if ier
   error('Abnormal termination')
end

if nargout == 0
  clear wlog
end

              otherwise
error(['Action ',action,' not defined'])


end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -