基于相等时间值合并向量:将LabData整合至Outputs结构体
解决方法:精确匹配时间点填充数据
要实现将LabData的手动采集数据对应填充到Outputs的新信号中,核心是找到两类数据中完全匹配的时间点,然后在对应位置赋值,其余位置保留NaN。以下是具体实现步骤和代码:
步骤1:匹配时间点索引
首先用ismember函数找到LabData.time在Outputs.time中的对应位置,这个函数会返回两个关键结果:
isMatch:布尔向量,标记LabData中每个时间点是否在Outputs.time中存在idx:向量,存储LabData.time每个元素在Outputs.time中的索引位置
[isMatch, idx] = ismember(LabData.time, Outputs.time);
步骤2:初始化并填充新信号
接下来为Outputs.signals新增第16和17个元素,先将它们的values字段初始化为和Outputs.time长度一致的NaN数组,再把LabData中对应时间点的数据填充到匹配的索引位置:
% 处理第16个信号:对应LabData.NdBoiler Outputs.signals(16).values = nan(size(Outputs.time)); % 仅填充存在匹配的时间点数据 Outputs.signals(16).values(idx(isMatch)) = LabData.NdBoiler(isMatch); % 处理第17个信号:对应LabData.NdOutput Outputs.signals(17).values = nan(size(Outputs.time)); Outputs.signals(17).values(idx(isMatch)) = LabData.NdOutput(isMatch);
可选:添加不匹配时间点的提示
如果LabData中有部分时间点在Outputs.time中找不到,你可以添加警告提示,方便排查数据问题:
if ~all(isMatch) warning('以下手动采集的时间点在自动采样数据中未找到:%s', num2str(LabData.time(~isMatch)')); end
验证示例
用你提供的测试数据验证:
% 测试输入 Outputs.time = [1; 2; 3; 4; 5]; Outputs.signals(1).values = [1111; 2222; 3333; 4444; 5555]; LabData.time = [2; 4]; LabData.NdBoiler = [1.23; 1.32]; % 运行上述代码后 disp(Outputs.signals(16).values); % 输出结果: % NaN % 1.23 % NaN % 1.32 % NaN
完全符合你的需求!
内容的提问来源于stack exchange,提问作者user2501247
相关产品推荐
相关产品推荐

