Matlab嵌套for循环未执行完毕问题求助
问题排查与修复建议
核心问题分析
你的代码仅能得到苹果公司的正确计算结果,后续公司结果均为0,根源在于索引逻辑错误和字符串匹配方式不当:
- 索引范围混淆:你先提取某公司的
Dates子集,再用strcmpi(Dates, ERDates(n))得到子集内的逻辑索引,但直接用该索引修改整个表T.ret(x)时,会错误修改表的前N行(N为该公司子集长度),而非对应公司的目标行。 - 字符串匹配失效:若
T.Ticker是cell字符串数组,使用==会触发逐字符比较,导致后续公司的匹配结果为空,最终prod(空数组)返回0。
修复步骤与代码
步骤1:修正字符串匹配逻辑
对于cell类型或字符串数组的Ticker,改用strcmpi做不区分大小写的匹配,兼容性更强。
步骤2:修正全局索引逻辑
直接在整个表中定位当前公司+目标财报日的行,避免子集索引的范围混淆。
修复后的代码:
% 获取唯一公司代码,保留原始顺序 firms = unique(T.Ticker, 'stable'); for i = 1:length(firms) currentTicker = firms(i); % 定位当前公司在整个表中的所有行(全局索引) firmRows = strcmpi(T.Ticker, currentTicker); % 获取当前公司的所有财报日并去重 firmERDates = unique(T.EarningsDate(firmRows)); for n = 1:length(firmERDates) currentERDate = firmERDates(n); % 定位当前公司中,财报日匹配的所有全局行 targetRows = firmRows & strcmpi(T.EarningsDate, currentERDate); % 仅在有匹配行时计算赋值,避免空索引报错 if any(targetRows) T.ret(targetRows) = prod(T.Return(targetRows)); end end end
额外排查点
- 检查
T.Return列是否存在缺失值(NaN),若有可改用prod(T.Return(targetRows), 'omitNaN')忽略缺失值。 - 确认
T.EarningsDate格式统一(如均为datetime类型或标准字符串格式),避免格式不一致导致匹配失败。 - 可在循环中加入调试输出(如
disp([currentTicker, ' 处理行数: ', num2str(sum(firmRows))])),确认每个公司都被正常循环处理。
内容的提问来源于stack exchange,提问作者VaKt
相关产品推荐
相关产品推荐

