诗岑 2023-03-05 09:41 采纳率: 93%
浏览 24
已结题

【matlab】动态数组的平均值问题

想要实现的:数组cycle_durations,在数组更新过程中对其中的所有元素求平均值ave_breath_duration.
现在发现不管cycle_durations长度多少,得到的平均值始终不变。
显然不对,但不知道问题出在哪

a=csvread('C:\Users\Administrator\Desktop\ppgsource\BVP.csv');
rel_data=a(50624:53568);
Fs=64;
t=[];
rel_data=filter(ditong3,rel_data);
rel_data=filter(bandpass_hann,rel_data);
n=length(rel_data);
for i=1:n
    t(i)=i/Fs;
end
wins.t_start=0;
wins.t_end=n;
t=t';
%rel_data=[t;rel_data];
%field={'t','v'};
data=struct('t',t,'v',data);
rel_data=struct('t',t,'v',rel_data);
%rr.t = mean([wins.t_start(:)' ; wins.t_end(:)']); 
rr.t = t(:);
rr.v = nan(length(rr.t),1);
for win_no = 1 : length(wins.t_start:wins.t_end)
    
    %% extract relevant data
    rel_els = find(rel_data.t >= wins.t_start& rel_data.t < wins.t_end);
    data.v = rel_data.v(rel_els);
    data.t = rel_data.t(rel_els);
    
    %% eliminate nans
    good_els = ~isnan(data.v);
    data.v = data.v(good_els); data.v = data.v(:);
    data.t = data.t(good_els); data.t = data.t(:);

    %% identify peaks
    diffs_on_left_of_pt = diff(data.v);diffs_on_left_of_pt = diffs_on_left_of_pt(1:(end-1)); diffs_on_left_of_pt = logical(diffs_on_left_of_pt>0);
    diffs_on_right_of_pt = diff(data.v);diffs_on_right_of_pt = diffs_on_right_of_pt(2:end); diffs_on_right_of_pt = logical(diffs_on_right_of_pt<0);
    peaks = find(diffs_on_left_of_pt & diffs_on_right_of_pt)+1;
    
    %% identify troughs
    diffs_on_left_of_pt = diff(data.v); diffs_on_left_of_pt = diffs_on_left_of_pt(1:(end-1)); diffs_on_left_of_pt = logical(diffs_on_left_of_pt<0);
    diffs_on_right_of_pt = diff(data.v); diffs_on_right_of_pt = diffs_on_right_of_pt(2:end); diffs_on_right_of_pt = logical(diffs_on_right_of_pt>0);
    troughs = find(diffs_on_left_of_pt & diffs_on_right_of_pt)+1;
    
    %% define threshold
    q3 = quantile(data.v(peaks), 0.5);
    thresh = 0.2*q3;
    
    %% find relevant peaks and troughs
    extrema = sort([peaks(:); troughs(:)]);
    rel_peaks = peaks(data.v(peaks) > thresh);
    rel_troughs = troughs(data.v(troughs) < 0);
    %% find valid breathing cycles
    % valid cycles start with a peak:
    valid_cycles = zeros(length(rel_peaks)-1,1);
    cycle_durations = nan(length(rel_peaks)-1,1);
    for peak_no = 1 : (length(rel_peaks)-1)
        
        % valid if there is only one rel_trough between this peak and the
        % next
        cycle_rel_troughs = rel_troughs(rel_troughs > rel_peaks(peak_no) & rel_troughs < rel_peaks(peak_no+1));
        if length(cycle_rel_troughs) == 1
            valid_cycles(peak_no) = 1;
            cycle_durations(peak_no) = data.t(rel_peaks(peak_no+1)) - data.t(rel_peaks(peak_no));
        end
        
    end
    
    if sum(valid_cycles) == 0 
        rr.v(win_no) = nan;
        continue
    end
    %% Calc RR
    % Using average breath length
    ave_breath_duration= nanmean(cycle_durations);
    rr.v(win_no) = 60/ave_breath_duration; 
end
  • 写回答

2条回答 默认 最新

  • CodeBytes 2023-03-05 09:53
    关注

    该回答引用ChatGPT

    问题出在以下代码段:

    if sum(valid_cycles) == 0 
        rr.v(win_no) = nan;
        continue
    end
    
    

    当没有找到任何有效呼吸周期时,代码会将该窗口的RR值设置为NaN并继续执行循环。但是,由于没有找到有效呼吸周期,因此平均呼吸持续时间“ave_breath_duration”仍然保持NaN值。然后,对NaN值执行除法运算会导致RR值也变为NaN值。因此,无论数组长度为多少,得到的平均值始终不变。

    要解决这个问题,可以在“if”语句中添加代码以设置“ave_breath_duration”的默认值。例如,将以下代码添加到“if”语句之前:

    ave_breath_duration = NaN;
    
    

    这将确保“ave_breath_duration”始终具有值,并且除法运算可以正确执行。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月13日
  • 已采纳回答 3月5日
  • 创建了问题 3月5日

悬赏问题

  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan