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

📄 qrtimax.m

📁 含有多种ICA算法的eeglab工具箱
💻 M
字号:
% qrtimax() -  perform Quartimax rotation of rows of a data matrix.%% Usage: >> [Q,B] = qrtimax(data);   %        >> [Q,B] = qrtimax(data,tol,'[no]reorder');%% Inputs:%        data      - input matrix%        tol       - the termination tolerance {default: 1e-4}%        noreorder - rotate without negation/reordering%% Outputs:%        B         - B=Q*A the Quartimax rotation of A%        Q         - the orthogonal rotation matrix%% Author: Sigurd Enghoff, CNL / Salk Institute, 6/18/98% Copyright (C) Sigurd Enghoff - CNL / Salk Institute, La Jolla 6/18/98%% This program is free software; you can redistribute it and/or modify% it under the terms of the GNU General Public License as published by% the Free Software Foundation; either version 2 of the License, or% (at your option) any later version.%% This program is distributed in the hope that it will be useful,% but WITHOUT ANY WARRANTY; without even the implied warranty of% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the% GNU General Public License for more details.%% You should have received a copy of the GNU General Public License% along with this program; if not, write to the Free Software% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA% $Log: qrtimax.m,v $% Revision 1.1  2002/04/05 17:36:45  jorn% Initial revision%% Reference: Jack O. Nehaus and Charles Wrigley (1954) % The Quartimax Method: an analytic approach to orthogonal % simple structure, Br J Stat Psychol, 7:81-91.% 01-25-02 reformated help & license -ad function [Q,B] = qrtimax(A,tol,reorder)if nargin < 1	help qrtimax	returnendDEFAULT_TOL = 1e-4;MAX_ITERATIONS = 50;if nargin < 3	reorder = 1;elseif isempty(reorder) | reorder == 0	reorder = 1; % set defaultelse	reorder = strcmp('reorder',reorder);endif nargin < 2	eps1 = DEFAULT_TOL;	eps2 = DEFAULT_TOL;else	eps1 = tol;	eps2 = tol;end% Do unto 'Q' what is done to AQ = eye(size(A,1));% Compute the cross-products of the rows of the squared loadings,% i.e. the cost function.%%  ---  ---%  \    \     2    2%  /    /    f    f%  ---  ---   ij   ik%   i   j<k%%  See reference, p. 85, line 3B = tril((A.^2)*(A.^2)');crit = [sum(sum(B)) - trace(B) , 0];% Initialize variablesinoim = 0;iflip = 1;ict = 0;% Main iterative loop: keep looping while no two consecutive trials % satisfy tolerance constraint AND less than MAX_ITERATIONS trials % AND one or more rotations were performed during last trial.while inoim < 2 & ict < MAX_ITERATIONS & iflip,	iflip = 0;% Run through all combinations of j and k	for j = 1:size(A,1)-1,		for k = j+1:size(A,1),%%          ---                                   ---%          \                2     2              \       2     2  2      2   2% fnum = 4 /    [f   f    (f   - f  )]  , fden = /    [(f   - f  )  - 4 f   f  ]%          ---    ki  kj    ki    kj             ---     ki    kj        ki  kj%           k                                     k%%  See equation (5)			u = A(j,:) .^ 2 - A(k,:) .^2;			v = 2 * A(j,:) .* A(k,:);			c = sum(u .^ 2 - v .^ 2);			d = sum(u .* v);			fden = c;			fnum = 2 * d;% Skip rotation if angle is too small			if abs(fnum) > eps1 * abs(fden)				iflip = 1;				angl = atan2(fnum, fden);% Set angle of rotation according to Table I				if fnum > 0					if fden > 0						angl = .25 * angl;					else						angl = .25 * (pi - angl);					end				else					if fden > 0						angl = .25 * (2 * pi - angl);					else						angl = .25 * (pi + angl);					end				end% Perform rotation				tmp    =  cos(angl) * Q(j,:) + sin(angl) * Q(k,:);				Q(k,:) = -sin(angl) * Q(j,:) + cos(angl) * Q(k,:);				Q(j,:) = tmp;				tmp    =  cos(angl) * A(j,:) + sin(angl) * A(k,:);				A(k,:) = -sin(angl) * A(j,:) + cos(angl) * A(k,:);				A(j,:) = tmp;			end		end	end% Compute cost function.	B = tril((A.^2)*(A.^2)');	crit = [sum(sum(B)) - trace(B) , crit(1)];		inoim = inoim + 1;	ict = ict + 1;	fprintf('#%d - crit = %g\n',ict,(crit(1)-crit(2))/crit(1));% Check relative change of cost function (termination criterion).	if (crit(1) - crit(2)) / crit(1) > eps2		inoim = 0;	endend% Reorder and negate if required. Determine new row order based on% row norms and reorder accordingly. Negate those rows in which the% accumulated sum is negative.if reorder	fprintf('Reordering rows...');	[fnorm index] = sort(sum(A'.^2));	Q = Q .* ((2 * (sum(A') > 0) - 1)' * ones(1, size(Q,2)));	A = A .* ((2 * (sum(A') > 0) - 1)' * ones(1, size(A,2)));	Q = Q(fliplr(index),:);	A = A(fliplr(index),:);	fprintf('\n');else	fprintf('Not reordering rows.\n');endB=A;

⌨️ 快捷键说明

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