MATLAB中if语句无法正确求值的问题求助
MATLAB代码问题:if语句始终判定为真,无法正确提取非零值
问题场景
我写了一段MATLAB代码,想从CSV文件的表格ALLDATA里提取非零值,创建命名列向量,但不管怎么写,if语句始终判定为真,完全起不到筛选作用。
原始代码
ALLDATA = table2array(readtable(filepath)); % Initialize column vectors numCols = size(ALLDATA, 2); colNames = ALLDATA(1,:); % Iterate over each column for j = 2:numCols % Get column name and initialize column vector, with room only for nonzero, non-title values colName = num2str(ALLDATA(1,j)); colVec = zeros(nnz(ALLDATA(:,j))-1,1); % Iterate over each value in column for i = 2:size(colVec) % If value is positive if ALLDATA(i,j)~=0 colVec(i)=ALLDATA(i,j); else continue; disp("no"); end end varName = ['duration_', strrep(colName, ' ', '_')]; eval([varName ' = colVec;']); end
尝试过的修改
我试过多种写法,包括:
if nnz(ALLDATA(i,j)) if ALLDATA(i,j)>0
也翻转逻辑写成:
if ALLDATA(i,j)==0 else continue;
但结果都一样,if语句始终判定为真,根本筛选不掉零值。
问题根源与修复方案
1. 核心问题:索引越界导致判断失效
内层循环用for i = 2:size(colVec),size(colVec)返回的是二维数组(比如[m,1]),MATLAB会自动取第一个元素作为循环上限,但colVec的长度是nnz(ALLDATA(:,j))-1,远小于ALLDATA的行数。当i超过ALLDATA的行数时,MATLAB返回NaN,而NaN~=0的结果为true,这就是if始终判定为真的原因。
2. 赋值逻辑错误:colVec索引不匹配
你用i直接作为colVec的索引,会导致colVec里留下大量未填充的零值,且越界访问会引发潜在报错。
修复后的代码
ALLDATA = table2array(readtable(filepath)); numCols = size(ALLDATA, 2); colNames = ALLDATA(1,:); for j = 2:numCols colName = num2str(ALLDATA(1,j)); % 提取当前列除标题行外的所有数据 colData = ALLDATA(2:end,j); % 直接筛选非零值,一步完成 colVec = colData(colData ~= 0); varName = ['duration_', strrep(colName, ' ', '_')]; eval([varName ' = colVec;']); end
额外优化:避免使用eval(推荐)
eval容易引发变量名冲突和调试困难,建议用结构体存储结果:
ALLDATA = table2array(readtable(filepath)); numCols = size(ALLDATA, 2); colNames = ALLDATA(1,:); % 用结构体统一存储所有结果 duration_data = struct(); for j = 2:numCols colName = num2str(ALLDATA(1,j)); colData = ALLDATA(2:end,j); colVec = colData(colData ~= 0); varName = ['duration_', strrep(colName, ' ', '_')]; duration_data.(varName) = colVec; end
内容的提问来源于stack exchange,提问作者Jared Cook
相关产品推荐
相关产品推荐

