自动添加数组的行

时间:2014-01-20 10:20:15

标签: java indexing

我有一个向量[1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0]和一个对应的19xn矩阵。我想基于向量的索引在矩阵的行中执行添加操作。所以我想添加对应索引一,二,三的行,最后构造一个包含3行的新数组。如何在不知道先前索引号的情况下自动执行此操作(但是知道它们按照我的示例进行排序)?

2 个答案:

答案 0 :(得分:1)

有几种选择。取决于性能或内存消耗是否更重要,取决于实际用例中向量/矩阵的大小,以及索引的实际分布情况。但是一个相当简单(恕我直言,优雅)和多功能的解决方案可能是创建一个映射,将每个索引映射到目前已计算的矩阵行的总和。可能存在效率稍高或需要较少内存的解决方案,但它们可能不太可读。

import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;

public class AddMatrixRows
{
    public static void main(String[] args)
    {
        double vector[] = {
            1.0, 1.0, 1.0, 1.0, 1.0, 
            2.0, 2.0, 2.0, 2.0, 2.0, 
            2.0, 2.0, 2.0, 3.0, 3.0, 
            3.0, 3.0, 3.0, 3.0};
        double matrix[][] = new double[vector.length][];
        for (int r=0; r<vector.length; r++)
        {
            matrix[r] = new double[] { 12, 34, 56 };
        }

        double sums[][] = computeSums(vector, matrix);
        for (int r=0; r<sums.length; r++)
        {
            System.out.println(Arrays.toString(sums[r]));
        }
    }

    private static double[][] computeSums(double vector[], double matrix[][])
    {
        Map<Integer, double[]> sumsByIndex = new LinkedHashMap<Integer, double[]>();
        for (int r=0; r<vector.length; r++)
        {
            int index = (int)vector[r];
            double array[] = sumsByIndex.get(index);
            if (array == null)
            {
                int numColumns = matrix[index].length;
                array = new double[numColumns];
                sumsByIndex.put(index, array);
            }
            add(array, matrix[index]);
        }
        return toArray(sumsByIndex.values());
    }

    private static double[][] toArray(Collection<double[]> collection)
    {
        double result[][] = new double[collection.size()][];
        int i = 0;
        for (double sum[] : collection)
        {
            result[i] = sum;
            i++;
        }
        return result;
    }

    private static void add(double array[], double addend[])
    {
        for (int i=0; i<array.length; i++)
        {
            array[i] += addend[i];
        }
    }
}

答案 1 :(得分:0)

您可以先从索引数组中获取最大数量,然后创建一个具有该大小的输出数组。现在,您可以遍历另一个矩阵并使用索引向量,将其添加到输出数组。