如何将固定三行的文本文件每行加载到MATLAB的不同向量中?
更优的MATLAB文本行转单独向量方法
嘿,我来分享几个比你当前cell数组写法更简洁高效的实现方案,完美匹配你的需求:
方法1:使用readmatrix(MATLAB R2019a+ 推荐)
这是最简洁的方式,新版本MATLAB原生支持,一行完成读取,再按行提取向量:
% 读取文件为数值矩阵(不同长度的行自动补NaN,若不需要补值看方法2) data = readmatrix('my_file.txt'); % 提取每行作为单独向量 vec1 = data(1,:); vec2 = data(2,:); vec3 = data(3,:);
如果你的行长度不一致且不想补NaN,可以改用readcell读取为字符串cell,再转换:
cell_data = readcell('my_file.txt', 'TextType', 'string'); vec1 = str2double(split(cell_data(1))); vec2 = str2double(split(cell_data(2))); vec3 = str2double(split(cell_data(3)));
方法2:使用textread(兼容旧版本MATLAB)
如果你的MATLAB版本较老,textread是兼容性更好的选择,按行读取后转成数值向量:
% 按行读取所有内容为字符串cell line_strs = textread('my_file.txt', '%s', 'delimiter', '\n'); % 逐个转换为数值向量 vec1 = str2double(strsplit(line_strs{1})); vec2 = str2double(strsplit(line_strs{2})); vec3 = str2double(strsplit(line_strs{3}));
方法3:改进你的循环写法(更规范的动态cell扩充)
如果你偏好循环实现,可以优化原代码,同时别忘了关闭文件句柄(这是你之前代码的遗漏点,很重要):
fid = fopen('my_file.txt'); vecs = {}; while ~feof(fid) line = fgetl(fid); % 跳过空行(避免读取到文件末尾的空内容) if ~isempty(line) vecs{end+1} = str2num(line); end end fclose(fid); % 必须关闭文件句柄,释放资源 % 提取单独向量 vec1 = vecs{1}; vec2 = vecs{2}; vec3 = vecs{3};
小提示
str2num在处理复杂字符串时不如str2double稳定,推荐优先使用str2double+split/strsplit的组合;- 若你明确知道文件只有3行,也可以直接用
fgetl三次读取,省去循环:fid = fopen('my_file.txt'); vec1 = str2double(strsplit(fgetl(fid))); vec2 = str2double(strsplit(fgetl(fid))); vec3 = str2double(strsplit(fgetl(fid))); fclose(fid);
内容的提问来源于stack exchange,提问作者Morpheus




