计算哈希图索引的平均值
calculate the average value across indicies of a hash map
我尝试编写这段代码来测试我关于如何计算散列映射的类似索引的平均值的想法。
即对于哈希图中包含的每个数组,如果第一个数组的第一个值是 2
,第二个数组的第一个值是 4
,第三个数组的第一个值是 3
,我想将 (4+3+2/3)= 3
的值分配给第一个索引的最终 double[] 数组,对于所有索引 2 到 n 依此类推。
int Size = 3;
double[] AVERAGED_WEIGHTS = new double[Size];
//store weights to be averaged.
Map<Integer,double[]> cached_weights = new HashMap<Integer,double[]>();
double[] weights = new double[Size];
int iteration = 0;
do
{
weights[iteration] = Math.floor(Math.random() * 10000) / 10000;
iteration++;
//store weights for averaging
cached_weights.put( iteration , weights );
}
while (iteration < Size);
//calc averages
for (Entry<Integer, double[]> entry : cached_weights.entrySet())
{
int key = entry.getKey();
double[] value = entry.getValue();
AVERAGED_WEIGHTS[ key - 1 ] += value[ key - 1 ];
if (key == iteration)
{
AVERAGED_WEIGHTS[ key - 1 ] /= key;
}
}
for(int i = 0; i < weights.length; i++)
{
weights[i] = AVERAGED_WEIGHTS[i];
}
这模仿了原始程序的结构,其中权重是通过 do while 循环填充的。虽然此代码已损坏,但无法成功执行上述操作。我一直在网上搜索并尝试不同的方法来修复它,但我无法解决它。也许有人可以发现我的错误逻辑。
也许我误解了你,但你没有计算平均值,因为对于地图中的每个数组,你没有考虑它的所有位置。您正在使用密钥,这完全没有意义。无论如何,您的代码非常混乱。您需要做的只是将一个循环套在另一个循环中。一个遍历数组,另一个遍历每个数组的元素。计算平均值的方法如下(以教学方式):
//compute averages
double[] sums = new double[size];
double[] averages = new double[size];
for (Entry<Integer, double[]> entry : cachedWeights.entrySet()) {
double[] value = entry.getValue();
for(int pos=0; pos < Math.min(size, value.length); pos++){
sums[pos] += value[pos];
}
}
for(int pos=0; pos < size; pos++){
averages[pos] = sums[pos] / cachedWeights.size();
}
我尝试编写这段代码来测试我关于如何计算散列映射的类似索引的平均值的想法。
即对于哈希图中包含的每个数组,如果第一个数组的第一个值是 2
,第二个数组的第一个值是 4
,第三个数组的第一个值是 3
,我想将 (4+3+2/3)= 3
的值分配给第一个索引的最终 double[] 数组,对于所有索引 2 到 n 依此类推。
int Size = 3;
double[] AVERAGED_WEIGHTS = new double[Size];
//store weights to be averaged.
Map<Integer,double[]> cached_weights = new HashMap<Integer,double[]>();
double[] weights = new double[Size];
int iteration = 0;
do
{
weights[iteration] = Math.floor(Math.random() * 10000) / 10000;
iteration++;
//store weights for averaging
cached_weights.put( iteration , weights );
}
while (iteration < Size);
//calc averages
for (Entry<Integer, double[]> entry : cached_weights.entrySet())
{
int key = entry.getKey();
double[] value = entry.getValue();
AVERAGED_WEIGHTS[ key - 1 ] += value[ key - 1 ];
if (key == iteration)
{
AVERAGED_WEIGHTS[ key - 1 ] /= key;
}
}
for(int i = 0; i < weights.length; i++)
{
weights[i] = AVERAGED_WEIGHTS[i];
}
这模仿了原始程序的结构,其中权重是通过 do while 循环填充的。虽然此代码已损坏,但无法成功执行上述操作。我一直在网上搜索并尝试不同的方法来修复它,但我无法解决它。也许有人可以发现我的错误逻辑。
也许我误解了你,但你没有计算平均值,因为对于地图中的每个数组,你没有考虑它的所有位置。您正在使用密钥,这完全没有意义。无论如何,您的代码非常混乱。您需要做的只是将一个循环套在另一个循环中。一个遍历数组,另一个遍历每个数组的元素。计算平均值的方法如下(以教学方式):
//compute averages
double[] sums = new double[size];
double[] averages = new double[size];
for (Entry<Integer, double[]> entry : cachedWeights.entrySet()) {
double[] value = entry.getValue();
for(int pos=0; pos < Math.min(size, value.length); pos++){
sums[pos] += value[pos];
}
}
for(int pos=0; pos < size; pos++){
averages[pos] = sums[pos] / cachedWeights.size();
}