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

📄 ewasobi.m

📁 ICALAB for Signal Processing Toolbox for BSS, ICA, cICA, ICA-R, SCA and MCA
💻 M
📖 第 1 页 / 共 2 页
字号:
    end       gam1=sum(f2o.*x1(1:k,:),1);    gam3=sum(f2o.*x3(1:k,:),1)+a0+phi(k,:);    x4(k+1,:)=ones(1,M);    b1m=sum(([phi(2:k+1,:); a0]+[zeros(1,M); phi(1:k,:)]).*x4(1:k+1,:));    b2m=sum(([a0; phi(k+1:-1:2,:)]+phi(k+2:2*k+2,:)).*x4(1:k+1,:));    latemp=b2m./alm;    b2m=latemp-lalold; lalold=latemp;    bom=alm./almold;    ok=ones(k+1,1);    x2(1:k+1,:)=x4(1:k+1,:).*(ok*(1./alm));    x1(1:k+1,:)=[x1(1:k,:); zeros(1,M)]-(ok*gam1).*x2(1:k+1,:);    x3(1:k+1,:)=[x3(1:k,:); zeros(1,M)]-(ok*gam3).*x2(1:k+1,:);    x4temp=x4(1:k,:);    x4(1:k+1,:)=[zeros(1,M); x4(1:k,:)]+[x4(2:k,:); ones(1,M); zeros(1,M)]...       -(ok*bom).*[x4old; ones(1,M); zeros(1,M)]...       -(ok*b2m).*x4(1:k+1,:)-(ok*b1m).*x1(1:k+1,:)-(ok*x4(1,:)).*x3(1:k+1,:);    x4old=x4temp;    almold=alm;endMK=M*K;G=zeros(K,MK);G(:,1:K:MK)=x1; clast=zeros(K,M);f1=[phi(2:K,:); zeros(1,M)]+[zeros(1,M); phi(1:K-1,:)];f2=[zeros(1,M); phi(K:-1:2,:)]+[phi(K+1:2*K-1,:); zeros(1,M)];for k=2:K    ck=G(:,k-1:K:MK);    G(:,k:K:MK)=[ck(2:K,:); zeros(1,M)]+[zeros(1,M);  ck(1:K-1,:)]...          -clast-(ok*sum(f1.*ck)).*x1-(ok*sum(f2.*ck)).*x2-(ok*ck(1,:)).*x3...          -(ok*ck(K,:)).*x4;    clast=ck;end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   of THinv5function [W] = ffdiag2(Rx_est,ini)%% computes Ziehe's ffdiag with pre-processing for maintaining% high stability even for badly conditioned mixing matrices% Next, ffdiag requires matrices stored in 3-dimensional field.    [d Md]= size(Rx_est);    M=Md/d;    [H1,D] = eig(Rx_est(:,1:d));    W_est = [];    for k = 1:d        W_est = [W_est; D(k,k)^(-.5)*H1(:,k)'/(H1(:,k)'*H1(:,k))];    end    R_zest=zeros(d,d,M);    for k = 1:M        id=(k-1)*d;        R_zest(:,:,k) = W_est*Rx_est(:,id+1:id+d)*W_est';    end    %%%        [W C stat] = ffdiag(R_zest,ini);  %%% CALLING ORIGINAL FFDIAG    %%%        W=W*W_est;end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   of ffdiag2function [V,C,stat] = ffdiag(C0,V0)%FFDIAG  Diagonalizes a set of matrices C_k with a (single) non-orthogonal transformation. %%% Usage:%%  function [V,CD,stat] = ffdiag(C0,V0)  %% Input:%    C0 - N x N x K array containing K symmetric matrices C_k which are to be diagonalized.%    V0 - initial value for the diagonalizer (default eye(N))%% Output:%    V    - joint diagonalization transformation (dimension N x N)%    CD   - diagonalized set of matrices (dimension N x N x K).%    stat - structure with some statistics of the algorithm's performance%        .etime      - elapsed time%        .errdiag    - diagonalization error%  % code by Andreas Ziehe and Pavel Laskov%%  (c) 2004  Fraunhofer FIRST.IDA %% Usage example:  %  % gen_mat; [V,C,stat]=ffdiag(C0); imagesc(V*A);  %  % The algorithm is derived in the paper:   %  A. Ziehe, P. Laskov, G. Nolte and K.-R. Mueller, % "A Fast Algorithm for Joint Diagonalization with Non-orthogonal%  Transformations and its Application to Blind Source Separation"%  Journal of Machine Learning Research vol 5, pages 777-800, 2004.%% An earlier version has been presented at the ICA 2003 Workshop in% Nara, Japan  % %  A. Ziehe and P. Laskov and K.-R. Mueller and G. Nolte%  "A Linear Least-Squares Algorithm for Joint Diagonalization",%  in Proc. of the 4th International Symposium on %  Independent Component Analysis and Blind Signal Separation%  (ICA2003), pages 469--474, Nara, Japan 2003.% %  % See also% http://www.first.fraunhofer.de/~ziehe/research/ffdiag.html    eps = 1e-9;%theta = 0.1;    % threshold for stepsize heuristics [m,n,k] = size(C0);C = C0;Id=eye(n);V = Id;%more clever initialization ???%[V,D]=eig(C0(:,:,1),C0(:,:,2));%or%[V,D]=eig(sum(C0,3));%V=V';inum = 1;df = 1;stat.method='FFDIAG';tic;while (df > eps & inum < 100)    % Compute W  W = getW(C);  %old normalization  no longer recommended   %as it deteriorates  convergence  %   %if (norm(W,'fro') > theta)  %  W = theta/norm(W,'fro')*W;  %end  % A much better way is to   % scale W by power of 2 so that its norm is <1 .  % necessary to make approximation assumptions hold  % i.e. W should be small  %     %if 0,  [f,e] = log2(norm(W,'inf'));  % s = max(0,e/2);  s = max(0,e-1);  W = W/(2^s );        % Compute update  V = (Id+W)*V;  %re-normalization  V=diag(1./sqrt(diag(V*V')))*V;  %norm(V)=1     for i=1:k    C(:,:,i) = V*C0(:,:,i)*V';  end     % Save stats  stat.W(:,:,inum) = W;  [f] = get_off(V,C0);  stat.f(inum) = f;  stat.errdiag(inum)=cost_off(C0,normit(V')');   stat.nw(inum) = norm(W(:));      if inum > 2    df = abs(stat.f(inum-1)-stat.f(inum));  end  %  fprintf(1,'itr %d :  %6.8f  \n ',inum, f);  inum = inum+1;endstat.etime=toc;   %elapsed timestat.niter=inum;  %number of iterationsstat.V=V;         %estimated diagonalizer%subplot(2,1,1);%semilogy(stat.f);%title('objective function');%subplot(2,1,2);%semilogy(stat.nw');%title('norm W');end   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% of ffdiagfunction W = getW(C)%getW   computes the update for FFDIAG.% % Usage:%    function W = getW(C)%% Input: %    C -  3-d array of matrices C_k%%  Output:%    W - update matrix with zeros on the main diagonal%% See also:%          FFDIAG%  [m,n,K] = size(C);W = zeros(n);z = zeros(n);y = zeros(n);for i=1:n  for j=1:n        for k=1:K      z(i,j) = z(i,j)+C(i,i,k)*C(j,j,k);      y(i,j) = y(i,j)+0.5*C(j,j,k)*(C(i,j,k)+conj(C(j,i,k)));    end  endendfor i=1:n-1  for j=i+1:n    W(i,j) = (z(j,i)*y(j,i)-z(i,i)*y(i,j))/(z(j,j)*z(i,i)-z(i,j)^2);    W(j,i) = ((z(i,j)*y(i,j)-z(j,j)*y(j,i))/(z(j,j)*z(i,i)-z(i,j)^2));  endend    end         %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% of getWfunction V=normit(V)%NORMIT  Normalize the Frobenius norm of all columns of a matrix to 1. [n,m]=size(V);for k=1:n,  nn=norm(V(:,k),'fro');  if nn<eps,warning('division may cause numerical errors');end  V(:,k)=V(:,k)/nn;endend         %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% of normitfunction [cost]=cost_off(C,V)%COST_OFF computes diagonalization error as the norm of the off-diagonal elements.%  C set of matrices in a 3-d array%  V diagonalizing matrix[N,N,K]=size(C);if nargin>1,  for k=1:K,    C(:,:,k)=V*C(:,:,k)*V';  endendcost=0;for k=1:K  Ck=C(:,:,k);Ck=Ck(:);  Ck(1:N+1:N*N)=0;  cost=cost+norm(Ck)^2;endend   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% of cost_offfunction [f,g] = get_off(V,C)%GET_OFF  a wrapper for OFF %% This function loops over 'off' and  adds up things over multiple matrices C.[m,n,K] = size(C);f = 0;g = sparse(n,n);h = sparse(n^2,n^2);h1 = sparse(n^2,n^2);h2 = sparse(n^2,n^2);for k=1:K  if nargout <= 1    f = f + off(V,C(:,:,k));  elseif nargout == 2    [ff,gg] = off(V,C(:,:,k));    f = f+ff;    g = g+gg;    gg  endendend %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% of get_offfunction [f,g] = off(V,C)%OFF - computes the value and the gradient of the "off" diagonality measure % % Usage:%        [f,g] = off(V,C)%% code by Pavel Laskov and Andreas Ziehe% % (c) 2004 Fraunfofer FIRST.IDAF = V*C*V';f = trace(F'*F) - trace(F.*F);if nargout > 1  g = 4*(F-diag(diag(F)))*V*C;endend %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% of off  %%% and of the whole ffdiag

⌨️ 快捷键说明

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