Libsvm可以读取以下数据文件并将其转换为matlab中的稀疏数据结构(使用libsvmread)。
-1 3:1 11:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1
-1 3:1 6:1 17:1 27:1 35:1 40:1 57:1 63:1 69:1 73:1 74:1 76:1 81:1 103:1
第一列是二进制分类的标签,其他列是特征向量。例如,在第一列中,仅位置3,11,14,19 ...不为零。
我有一个文件,其中这些位置没有排序。例如,它可能像 -
-1 11:1 3:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1
Libsvmread在这种情况下不会工作。无论如何,我可以在哪里对数据进行排序(根据位置)还是有任何现有的代码可以帮助我在matlab中提取这些数据?
目标是给定此示例输入
-1 11:1 3:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1
-1 3:1 2:1 6:1 4:1 17:1 27:1 35:1 40:1 57:1 63:1 69:1 73:1 74:1 76:1 81:1 103:1
我们得到以下输出:
-1 3:1 11:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1
-1 2:1 3:1 4:1 6:1 17:1 27:1 35:1 40:1 57:1 63:1 69:1 73:1 74:1 76:1 81:1 103:1
答案 0 :(得分:1)
将所有信息存储在数组a[]
中,然后使用索引进行排序:
awk '{delete a
for (i=2; i<=NF; i++)
a[$i+0]=$i
n=asorti(a, sorted, "@ind_num_asc")
printf "%s%s", $1, OFS
for (i=1;i<=n;i++)
printf "%s%s", a[sorted[i]], (i==n?ORS:OFS)}' file
这使用asorti()和@ind_num_asc
来定义排序模式。
对于每一行,我们将数据a[]
存储在从第二个字段开始的所有数据中。然后,我们按数字排序并按排序顺序打印回来。
delete a
删除数组,以便我们只追加此行的数据。for (i=2; i<=NF; i++) a[$i+0]=$i
将每个字段存储为数组中的元素。通过说$i+0
我们将xx:yy
转换为xx
,以便索引只是该字段的左侧部分。n=asorti(a, sorted, "@ind_num_asc")
使用索引对数组进行排序,并将其存储在sorted[]
数组中。通过说@ind_num_asc
,我们告诉asorti
使用索引,数字和上升顺序。printf "%s%s", $1, OFS
打印第一个字段,即单独的字段。for (i=1;i<=n;i++) printf "%s%s", a[sorted[i]], (i==n?ORS:OFS)
遍历已排序的值并打印它们。$ awk '{delete a; for (i=2; i<=NF; i++) {a[$i+0]=$i}; n=asorti(a, sorted, "@ind_num_asc"); printf "%s%s", $1, OFS; for (i=1;i<=n;i++) printf "%s%s", a[sorted[i]], (i==n?ORS:OFS)}' a
1 3:1 11:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1
-1 2:1 3:1 4:1 6:1 17:1 27:1 35:1 40:1 57:1 63:1 69:1 73:1 74:1 76:1 81:1 103:1
答案 1 :(得分:0)
虽然我喜欢awk的答案,但还有另一个适用于你的设置。
while read line; do echo $line | tr ' ' '\n' | sort -n | tr '\n' ' '; echo ""; done < inputfile
将行转换为列并使用sort,然后再转置;基于给定格式,第一个元素将按数字排序。