包装器用于matlab读取稀疏数据文件

时间:2015-06-08 13:35:54

标签: matlab sorting text awk libsvm

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

2 个答案:

答案 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,然后再转置;基于给定格式,第一个元素将按数字排序。