diff --git a/meldata.cc b/meldata.cc index a00f69863f6926a78698cd86934f9a60b22d780d..0df217d34654fae39a0859d46f87ce74f069ff2b 100644 --- a/meldata.cc +++ b/meldata.cc @@ -303,11 +303,22 @@ namespace Melodic{ std_pca(tmpData, RXweight, Corr, pcaE, pcaD); calc_white(pcaE, pcaD, order, newWM, newDWM); }else{ - std_pca(whiteMatrix*tmpData, RXweight, Corr, pcaE, pcaD); - calc_white(pcaE, pcaD, order, newWM, newDWM); - newDWM=(dewhiteMatrix*newDWM); - newWM=(newWM*whiteMatrix); - } + if(!opts.dr_pca.value()){ + std_pca(whiteMatrix*tmpData, RXweight, Corr, pcaE, pcaD); + calc_white(pcaE, pcaD, order, newWM, newDWM); + newDWM=(dewhiteMatrix*newDWM); + newWM=(newWM*whiteMatrix); + } + else{ + Matrix tmp1, tmp2; + tmp1 = whiteMatrix * alldat; + tmp1 = remmean(tmp1,2) * tmpData.t(); + tmp2 = pinv(tmp1); + std_pca(tmp1 * tmpData, RXweight, Corr, pcaE, pcaD); + calc_white(pcaE, pcaD, order, newWM, newDWM); + newDWM=(tmp2*newDWM); + newWM=(newWM * tmp1); + } DWM.push_back(newDWM); WM.push_back(newWM); tmpData = newWM * tmpData; diff --git a/meloptions.h b/meloptions.h index ba86f82b60cb954aacc02ad2684d96980a46d15b..722b81d8a2cedb3be1811673edfa7f19bbe8fc75 100644 --- a/meloptions.h +++ b/meloptions.h @@ -55,7 +55,8 @@ class MelodicOptions { Option<string> pca_est; Option<bool> joined_whiten; Option<bool> joined_vn; - Option<float> vn_level; + Option<bool> dr_pca; + Option<float> vn_level; Option<int> numICs; Option<string> approach; Option<string> nonlinearity; @@ -191,6 +192,9 @@ class MelodicOptions { joined_vn(string("--sep_vn"), true, string("switch off joined variance nomalisation"), false, no_argument), + dr_pca(string("--mod_pca"), false, + string("switch on modified PCA for concat ICA"), + false, no_argument, false), vn_level(string("--vn_level"), float(2.3), string("variance nomalisation threshold level (Z> value is ignored)"), false, requires_argument, false), @@ -391,6 +395,7 @@ class MelodicOptions { options.add(pca_est); options.add(joined_whiten); options.add(joined_vn); + options.add(dr_pca); options.add(vn_level); options.add(numICs); options.add(approach);