Octave中多类型鸢尾花数据集文本转矩阵的实现问题
解决Octave读取鸢尾花混合类型数据集的问题
嘿,我来帮你搞定这个Octave读取鸢尾花数据集的问题~你遇到的问题主要有两个原因:一是你的数据是逗号分隔的,但你用fscanf时格式字符串写的是空格分隔,导致匹配失败;二是数据混合了数值和字符串类型,fscanf没办法直接生成带行列结构的混合矩阵(它会把所有匹配内容压成一维数组,而且字符串和数值不能混存)。
下面给你几个实用的解决方案,任选一种都能满足你“行列访问”的需求:
方案一:用textread直接拆分混合类型数据
textread是Octave处理混合格式文本数据的利器,能直接按列拆分数值和字符串:
% 按逗号分隔读取,分别存储数值列和标签列 [sepal_len, sepal_wid, petal_len, petal_wid, species] = textread("train.txt", "%f,%f,%f,%f,%s", "delimiter", ","); % 将数值列组合成可行列访问的矩阵 numeric_data = [sepal_len, sepal_wid, petal_len, petal_wid];
这样你就可以用numeric_data(1,1)拿到第一行第一列的5.4,用species(1)拿到对应的"Iris-setosa"标签。
方案二:分开读取数值部分和标签部分
如果你只需要先处理数值数据,也可以把数值和标签分开读取:
% 用dlmread读取前4列数值(逗号分隔) % 参数格式:dlmread(文件名, 分隔符, [起始行 起始列 结束行 结束列]),-1代表最后一行/列 numeric_data = dlmread("train.txt", ",", [0 0 -1 3]); % 用textread跳过前4列数值,只读取最后一列标签 species = textread("train.txt", "%*f,%*f,%*f,%*f,%s", "delimiter", ",");
这个方法的好处是numeric_data直接就是标准的数值矩阵,行列访问完全没问题。
方案三:用readtable生成表格(适合新版Octave)
如果你的Octave版本是5.1及以上,推荐用readtable,它会把数据转换成表格结构,可读性和操作性都更强:
% 读取文件并指定列名 data_table = readtable("train.txt", "Delimiter", ",", ... "VariableNames", {"SepalLength", "SepalWidth", "PetalLength", "PetalWidth", "Species"});
之后你可以用data_table{1,1}获取第一行第一列的5.4,或者用列名访问data_table.SepalLength(1),非常直观。
小提醒
如果train.txt不在Octave当前的工作目录里,记得把文件名改成完整路径(比如"/home/yourname/data/train.txt")。
内容的提问来源于stack exchange,提问作者buydadip
相关产品推荐
相关产品推荐

