我有一个向量[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行的新数组。如何在不知道先前索引号的情况下自动执行此操作(但是知道它们按照我的示例进行排序)?
答案 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)
您可以先从索引数组中获取最大数量,然后创建一个具有该大小的输出数组。现在,您可以遍历另一个矩阵并使用索引向量,将其添加到输出数组。