0

我想将 N 个 d 维数组列表连接成一个大数组列表。我做了以下工作:

 {
     Arraylist<Double> cFeature = new Arraylist<Double>(); 
     for(int i =0 ; i < n; i++){
        ArrayList<Double> arrList = new ArrayList<Double>();
        arrList = FeatureMatrix.get(i);
        cFeature.addAll(arrList);
     }  
    return cFeature;
}

但这并没有返回我连接的特征向量。可能是什么原因?

我有以下类型的矩阵

    1 2 3 4
    4 5 6 7
    9 4 5 2

我想返回类似的东西:

    12344567, 45679452 etc

EDIT[矩阵一排],矩阵的维数为50

   [-1.4707351089135285, -2.396807707665656, -0.9225858560474335, -0.552093667789784, 0.6492206869123566, 1.1347653279780474, 0.18599226559979623, -0.3040490372134513, -0.8661743997164002, 1.2990217001062885, -1.4689261255216413, -0.6175058675322327, 0.0019875740898560707, 3.187991109660048, 0.9793588130569899, 1.88726260031087, 1.263110196592273, 0.10270882950413489, -0.33850097448844163, 0.26780865103769547, -0.28117099016766645, -0.015511886681809741, -0.7906057240014217, 0.1796874905794462, 0.9327631100459427, 0.5419684468033518, 1.3670537985364393, -1.0381888770019032, 1.0975151287297011, 0.024367745998744996, -0.25780912155025204, -1.862325174655491, -0.611104255824939, -0.5746070435381269, -1.2218773341433158, 0.2220916817954159, 0.4641455500389115, -0.43253367269335635, -0.5380163044326588, 0.685592907063921, -0.6191939669845238, -1.2275198581496152, 0.13270110767423787, -0.1614948461888469, 1.5717904793822337, -0.2826323802880358, -0.4716922630198008, -0.2881374794211655, 0.8609910302314909, 1.1749707572533885]
4

1 回答 1

1

您在问题中遗漏了代码的关键部分。查看聊天pastebin 上的完整代码,在我看来,问题在于您不了解 Java 中的赋值是如何工作的(也许您有 C++ 背景?)

    ArrayList<Double> contextFeature = new ArrayList<Double>();
    contextFeature = wordFeatureMatrix.get(x); // x is a valid integer key, actually FrequentWordIndex.get(Ngram.get(0).toLowerCase()) in the pastebin code

这会破坏您为 contextFeature 创建的原始 ArrayList,并将其替换为 wordFeatureMatrix 中的 ArrayList 之一。

然后稍后您不是迭代wordFeatureMatrix而是迭代一个将索引返回到 wordFeatureMatrix 的列表。我有信心在某个时候

wordFeatureMatrix.get(FrequentWordIndex.get(Ngram.get(0).toLowerCase())) ==
    wordFeatureMatrix.get(FrequentWordIndex.get(Ngram.get(i).toLowerCase()));

这意味着稍后您实际上是在打电话

 contextFeature.addAll(contextFeature);

来自 JavaDoc 的ArrayList.addAll()

如果在操作正在进行时修改了指定的集合,则此操作的行为是未定义的。(这意味着如果指定的 Collection 是这个列表,并且这个列表是非空的,那么这个调用的行为是未定义的。)

所以,你有两个问题。wordFeatureMatrix首先是在收集列表的过程中不要修改contextFeature,解决方法是替换

    ArrayList<Double> contextFeature = new ArrayList<Double>();
    contextFeature = wordFeatureMatrix.get(x); 

    ArrayList<Double> contextFeature = new ArrayList<Double>();
    contextFeature.addAll(wordFeatureMatrix.get(x)); 

第二个问题(在您的用例中可能不是问题)是确保不会将同一个列表添加两次。这取决于你决定它是否是你想要的。

于 2012-04-22T06:16:02.793 回答