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

📄 l_principal_components.m

📁 实现地震勘探中
💻 M
字号:
function [wlog,aux]=l_principal_components(wlog,varargin)% Compute principal-component representation of two or more log curves.%% Written by: E. R.: January 30, 2008% Last updated: February 21, 2008: Generalize the way curve mnemonics are%                                  specified%%         [wlog,aux]=l_principal_components(wlog,varargin)% INPUT% wlog% varargin  one or more cell arrays; the first element of each cell array %         is a keyword, the other elements are parameters. %         Presently, keywords are:%     'curves'  mnemonics of the curves to include in PC analysis%         Default: {'curves',[]}  This means use: use all curves excepth the depth%     'logdomain'   Possible values are "true" (or 'yes') and "false" (or 'no').%         if "true" the principal components are computed for the logarithm of %            the curves, and the final result is exponentiated.%         Default: {'logdomain',true}%     'npc'  number of principal componets to use for the principal-component %         representation of the selected log curves.%         Default: {'npc',2}%     'option'  Options for the computed curves; possible strings are%         'append'   Append the new curves after the old ones; the mnemonics of%             the new curve have the original curve mnemonics with %             ['_pc',num2str(npc)] appended. The string [' (PC ',num2str(npc),')']%             is appended to the curve description. %         'replace'  Replace the old curves by the new curves; curve mnemonics%             and description are not changed.%         Default: {'option','append'}%     'scaling'  Possible values are "true" (or 'yes') and "false" (or 'no').%         if "scaling"s true then the curves are scaled to have norm 1 before %         computing the principal components. This is important if the curves%         have different scales (such as density and velocity)%         Default: {'scaling',true}% OUTPUT% wlog    Input log with the new curves repacing the old curves or appended%         to the existing curves% aux     structure with auxiliary output data%% EXAMPLE%         wlog=l_data;%         [wlog1,aux]=l_principal_components(wlog,{'curves','vp','vs','rho'});%%         l_curve(wlog1)%%         lfigure%         subplot(1,3,1)%            h1=l_plot1(wlog1,{'curves','rho','rho_pc2'},{'depths',6000,6100},{'figure','old'});%         subplot(1,3,2)%            h2=l_plot1(wlog1,{'curves','Vp','Vp_pc2'},{'depths',6000,6100},{'figure','old'});%         subplot(1,3,3)%            h3=l_plot1(wlog1,{'curves','Vs','Vs_pc2'},{'depths',6000,6100},{'figure','old'});%         linkaxes([h1.axis_handle,h2.axis_handle,h3.axis_handle],'y')%        Defaults of input argumentsparam.npc=2;param.curves=[];param.logdomain=true;param.option='append';param.scaling=true;   %        Replace defaults with actual input argumentsparam=assign_input(param,varargin);%        Handle different options of providing the curves to use for Principal%        Component analysisif isempty(param.curves)   param.curves=wlog.curve_info(2:end)';elseif ischar(param.curves)   param.curves=tokens(param.curves);elseif iscell(param.curves{1})   param.curves=param.curves{1};else   % Do nothingendindex=curve_indices(wlog,param.curves);ncurves=length(param.curves);if length(index) ~= ncurves   disp(' Not all requested curves have been found.')   disp(' Curves requested:')   disp(cell2str(param.curves,','))   disp(' Existing curves:')   disp(cell2str(wlog.curve_info(:,1),','))   error('Abnormal termination.')endmat=wlog.curves(:,index);%       Check for and remove NaNsbool=all(~isnan(mat),2);index1=find(bool);if isempty(index1)   mywarning('No rows without NaNs found.')   returnendif length(index) == 1   mywarning('Only one row without NaNs found; no action taken.')endmat1=mat(index1,:);%       Take the logarithm of the curves if requestedif isyes(param.logdomain)   mat1=log(mat1);end%       Scale the matrix columns so that they have unity normif isyes(param.scaling)   scf=vnorm(mat1);   mat1=bsxfun(@times,mat1,1./scf);end%       Compute principal components[pc,d,coeff]=principal_components(mat1);%       Remove effect of previously applied scaling by scaling the coefficientsif isyes(param.scaling)   coeff=bsxfun(@times,scf,coeff);end%       Compute the first "param.npc" sums of the principal componentsmat1=pc(:,1:param.npc)*coeff(1:param.npc,:);if nargout > 1   aux.coeff=coeff;   aux.d=d;   aux.pc=pc;   aux.curves=wlog.curve_info(index,1)';end%       Exponentiate the curves if requestedif isyes(param.logdomain)   mat1=exp(mat1);endmat(:)=NaN;mat(index1,:)=mat1;switch param.optioncase 'append'   wlog.curves=[wlog.curves,mat];   info=wlog.curve_info(index,:);   append1=['_pc',num2str(param.npc)];   append3=[' (PC ',num2str(param.npc),')'];   for ii=1:ncurves      info(ii,[1,3])={[info{ii,1},append1],[info{ii,3},append3]};   end   wlog.curve_info=[wlog.curve_info;info];case 'replace'   wlog.curves(:,index)=mat;otherwise   error(['Unknown option: ',param.option])end

⌨️ 快捷键说明

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