关于*iter++的含义

1、如果对c语言和c++不熟悉的经常会不清楚表达式*iter++的含义。首先由于后自增操作的优先级高于解引用操作,因此*iter++等效于*(iter++)。子表达式iter++使iter加1,然后返回iter原值的副本作为该表达式的结果。因此解引用操作*的操作数是iter未加1前的副本~!


2、条件操作符的优先级非常低!因此,在更大的一个表达式中,嵌入条件表达式时,通常必须用圆括号把表达式括起来。

``` % Estimation part % %-----------------% rho_i = 2.5; w_i = (d_i.^(-1)./sum(d_i.^(-1)))'; Max_iter = 1e2; x_est = 2 * Border * rand(3,M) - Border; % 3xM delta_i_est = 2 * Border * rand(N,1) - Border; % 调整变量维度为三维 u_i = 2 * Border * rand(3,N) - Border; u_i = u_i ./ vecnorm(u_i); % 单位向量 v_i = 2 * Border * rand(3,N) - Border; h_i = 2 * Border * rand(3,N) - Border; q_i = 2 * Border * rand(N,1) - Border; lambda_i = 2 * Border * rand(3,N) - Border; nu_i = 2 * Border * rand(3,N) - Border; mu_i = 2 * Border * rand(N,1) - Border; x_est(:,2) = 1e6 * ones(3,M); % 初始化 iter = 1; while iter <= Max_iter && norm(x_est(:,end) - x_est(:,end-1)) > 1e-3 % 三维索引调整 v_prev = v_i(:,:,iter); h_prev = h_i(:,:,iter); % 位置估计(三维) x_est(:,iter+1) = sum(w_i .* (a_i + v_prev - h_prev), 2); for tt = 1:N % 三维变量更新 delta_prev = delta_i_est(tt,iter); u_prev = u_i(:,tt,iter); v_prev_tt = v_i(:,tt,iter); h_prev_tt = h_i(:,tt,iter); q_prev = q_i(tt,iter); lambda_prev = lambda_i(:,tt,iter); nu_prev = nu_i(:,tt,iter); mu_prev = mu_i(tt,iter); % ADMM更新步骤(调整三维运算) delta_i_est(tt,iter+1) = (rho_i * d_i(tt) * q_prev + ... rho_i * u_prev' * h_prev_tt - d_i(tt) * mu_prev - ... u_prev' * nu_prev)/(1 + rho_i + rho_i * d_i(tt)^2); u_next = (rho_i * delta_i_est(tt,iter+1) * h_prev_tt + ... rho_i * d_i(tt) * v_prev_tt - ... delta_i_est(tt,iter+1) * nu_prev - ... d_i(tt) * lambda_prev) / ... (rho_i * (d_i(tt)^2 + delta_i_est(tt,iter+1)^2)); u_i(:,tt,iter+1) = u_next / max(1, norm(u_next)); v_i(:,tt,iter+1) = (x_est(:,iter+1) - a_i(:,tt) + lambda_prev + ... rho_i * d_i(tt) * u_i(:,tt,iter+1)) / rho_i; h_i(:,tt,iter+1) = (-x_est(:,iter+1) + a_i(:,tt) + nu_prev + ... rho_i * delta_i_est(tt,iter+1) * u_i(:,tt,iter+1)) / rho_i; q_i(tt,iter+1) = (rho_i * d_i(tt) * delta_i_est(tt,iter+1) + mu_prev + 1) / rho_i; lambda_i(:,tt,iter+1) = lambda_prev + rho_i * (d_i(tt) * u_i(:,tt,iter+1) - v_i(:,tt,iter+1)); nu_i(:,tt,iter+1) = nu_prev + rho_i * (delta_i_est(tt,iter+1) * u_i(:,tt,iter+1) - h_i(:,tt,iter+1)); mu_i(tt,iter+1) = mu_prev + rho_i * (d_i(tt) * delta_i_est(tt,iter+1) - q_i(tt,iter+1)); end iter = iter + 1; end```解释每一行代码
03-08
function [IFest IAest sest] = ACMD(s,fs,eIF,alpha0,beta,tol) %% initialize N = length(eIF);%N is the number of the samples t = (0:N-1)/fs;%time e = ones(N,1); e2 = -2*e; oper = spdiags([e e2 e], 0:2, N-2, N);%the second-order difference matrix spzeros = spdiags([zeros(N,1)], 0, N-2, N); opedoub = oper'*oper;% phim = [oper spzeros;spzeros oper]; phidoubm = phim'*phim; iternum = 100; %the maximum allowable iterations IFsetiter = zeros(iternum,N); %the collection of the obtained IF time series of the signal modes at each iteration ssetiter = zeros(iternum,N); %the collection of the obtained signal modes at each iteration ysetiter = zeros(iternum,2*N); %% iterations iter = 1;% iteration counter sDif = tol + 1;% alpha = alpha0; while ( sDif > tol && iter <= iternum ) % cosm = cos(2*pi*(cumtrapz(t,eIF))); sinm = sin(2*pi*(cumtrapz(t,eIF))); Cm = spdiags(cosm(:), 0, N, N); Sm = spdiags(sinm(:), 0, N, N); Kerm = [Cm Sm]; %kernel matrix Kerdoubm = Kerm'*Kerm; %%%%%%%%%%%%%%%%update demodulated signals%%%%%%%%%%%%%%%%%%%%%%%%%%%5 ym = (1/alpha*phidoubm + Kerdoubm)\(Kerm'*s(:)); %the demodulated target signal si = Kerm*ym; %the signal component ssetiter(iter,:) = si; ysetiter(iter,:) = ym; %%%%%%%%%%%%% update the IFs %%%%%%%%%%%%%%%%%%%%%%%% ycm = (ym(1:N))'; ysm = (ym(N+1:end))'; % the two demodulated quadrature signals ycmbar = Differ(ycm,1/fs); ysmbar = Differ(ysm,1/fs);%compute the derivative of the functions deltaIF = (ycm.*ysmbar - ysm.*ycmbar)./(ycm.^2 + ysm.^2)/2/pi;% obtain the frequency increment by arctangent demodulation deltaIF = (1/beta*opedoub + speye(N))\deltaIF';% smooth the frequency increment by low pass filtering eIF = eIF - mean(deltaIF);% update the IF%deltaIF';% update the IF mean(deltaIF);% update the IF IFsetiter(iter,:) = eIF; %%%%%%%%%%%%% compute the convergence index %%%%%%%%%%%%%%%%%% if iter>1 sDif = (norm(ssetiter(iter,:) - ssetiter(iter-1,:))/norm(ssetiter(iter-1,:))).^2; end iter = iter + 1; end iter = iter -1; % maximum iteration IFest = IFsetiter(iter,:); %estimated IF sest = ssetit
最新发布
06-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值