Matlab遍历非隐藏文件存入元胞数组时索引异常求助
问题根源:元胞数组的索引赋值“坑”
哈哈,这个问题我之前也踩过!你现在ecell大小是1×28,是因为你直接用循环变量i作为元胞数组的索引来赋值——当i遍历到.、..、.DS_Store这些被过滤的文件时,你跳过了赋值,但MATLAB会自动把ecell的长度扩展到当前的i值,那些没被赋值的索引位置就会留下空元胞,最终数组长度就等于listing的总长度(28),而不是有效文件的数量(25)。
举个直观的例子:假设前3个listing元素是隐藏文件,当i=4时你给ecell{4}赋值,MATLAB会自动创建ecell(1)到ecell(3)这三个空元胞,把数组拉到4个元素;后面每遇到一个有效文件,就继续在对应的i位置赋值,直到i=28,自然就有28个元素了。
快速修复:用计数器跟踪有效位置
解决办法很简单,别用循环变量i当索引,改用一个独立的计数器来记录有效元素的位置:
listing = dir(png_dirpath); ecell = {}; k = 1; % 专门用来计数有效文件的变量 for i = 1:length(listing) name = listing(i).name; if ~strncmp(name, '.', 1) % 排除隐藏文件 disp(listing(i).name); ecell{k} = fullfile(png_dirpath, listing(i).name); k = k + 1; % 每添加一个有效文件,计数器加1 end end
这样ecell只会存储符合条件的25个文件路径,大小就是1×25,完全没有多余的空元素。
更简洁的写法:用逻辑索引替代循环
如果你想省掉手动管理计数器的麻烦,还可以用MATLAB的逻辑索引来简化代码,一行过滤+一行生成数组搞定:
listing = dir(png_dirpath); % 先筛选出所有不以'.'开头的文件 valid_files = listing(~cellfun(@(x) strncmp(x, '.', 1), {listing.name})); % 直接生成包含完整路径的元胞数组 ecell = fullfile(png_dirpath, {valid_files.name});
这种写法更符合MATLAB的向量式编程风格,代码更简洁,结果也和循环方法完全一致。
内容的提问来源于stack exchange,提问作者snazziii
相关产品推荐
相关产品推荐

