You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MATLAB新增for循环后计算结果异常问题排查

MATLAB循环嵌套后计算结果异常问题分析

在MATLAB中新增for level循环后,对应变量的计算结果出现异常。固定level=1时代码运行正常,输出如下:

0
0
0
0
0
38

但新增for level = 1:2循环后,p_M_level第二列结果异常,手动修改level值时结果却正常。


原代码(固定level=1)

level = 1;
for distance = 1:6
  for jj = 1:kol_real
            disp(jj)
            f_pr1 = 7;
            f_pr2 = 13 + distance;
            
            U1 = U(:, f_pr1)+U(:, f_pr2);%sum of two signals u(t) = sin(2*pi*f_0*t) with different f_0
            add_noise_norm = normrnd(0, 0.2 + (0.1 *level), [N + kol_shift, 1]);
            U_pr_norm = U1 + add_noise_norm;%add some noise
                        
            parfor dd = 1:25
                M_norm(dd, jj) = corr(U_pr_norm, U(:, dd));  % calculate correlation  
            end

            [~, zz_M_norm] = findpeaks(M_norm(:, jj), 'NPeaks', 8,'SortStr','descend'); % find peaks of correlation function
            min_M_norm(1:length(zz_M_norm),jj) =  sortrows(zz_M_norm,'ascend');% write value into two array
%            
  end

 min_M_norm_temp = min_M_norm(1:2,:);
 min_M_norm_temp(:, any(min_M_norm_temp == 0)) = [];%delete if i have one zeros element
 count_M_norm = abs(min_M_norm_temp(1, :) - min_M_norm_temp(2, :)) >= 2;% compare using some condition
 p_M_norm(distance) = sum(count_M_norm);
end

新增level循环后的代码

for level = 1:2;
for distance = 1:6
for jj = 1:kol_real
            disp(jj)
            f_pr1 = 7;
            f_pr2 = 13 + distance;
            
            U1 = U(:, f_pr1)+U(:, f_pr2);%sum of two signals u(t) = sin(2*pi*f_0*t) with different f_0
            add_noise_norm = normrnd(0, 0.2 + (0.1 *level), [N + kol_shift, 1]);
            U_pr_norm = U1 + add_noise_norm;%add some noise
                        
            parfor dd = 1:25
                M_norm(dd, jj) = corr(U_pr_norm, U(:, dd));  % calculate correlation  
            end

            [~, zz_M_norm] = findpeaks(M_norm(:, jj), 'NPeaks', 8,'SortStr','descend'); % find peaks of correlation function
            min_M_norm(1:length(zz_M_norm),jj) =  sortrows(zz_M_norm,'ascend');% write value into two array
%            
end

 min_M_norm_temp = min_M_norm(1:2,:);
 min_M_norm_temp(:, any(min_M_norm_temp == 0)) = [];%delete if i have one zeros element
 count_M_norm = abs(min_M_norm_temp(1, :) - min_M_norm_temp(2, :)) >= 2;% compare using some condition
 p_M_norm(distance) = sum(count_M_norm);
end
 p_M_level(:,level) = p_M_norm;
end

新增循环后的异常结果

0   38
0   38
0   38
0   38
0   35
38  38

问题根源

核心问题是循环变量未初始化:在level和distance循环中,M_norm、min_M_norm、p_M_norm这些变量没有在每次循环开始前重置为初始状态,导致上一轮循环的残留数据干扰当前计算。

  • 比如当运行level=2时,M_norm还保留着level=1时的计算值,min_M_norm也会累积之前的结果,最终导致后续的count_M_norm和p_M_norm计算逻辑出错。
  • 手动修改level值时,每次运行前这些变量都是全新的,没有残留数据,所以结果正确;但嵌套循环时变量会被重复使用,残留数据直接引发异常。

修正方案

在每个循环的开头添加变量初始化代码,确保每次循环都从干净的状态开始:

  1. 在for level = 1:2内部、for distance = 1:6之前,初始化p_M_norm:
p_M_norm = zeros(6, 1); % 对应distance的6个取值维度
  1. 在for distance = 1:6内部、for jj = 1:kol_real之前,初始化M_norm和min_M_norm:
M_norm = zeros(25, kol_real); % 对应dd=1:25和jj=1:kol_real的维度
min_M_norm = zeros(8, kol_real); % 因findpeaks最多取8个峰,行数设为8

修改后,每次循环都会重置相关变量,不会残留上一次的计算数据,结果会和手动修改level值时一致。


内容的提问来源于stack exchange,提问作者Валера Слободянюк

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 13:07:43