matrix-java 与 php 计算结果的差异

问题描述

java 与 php 计算结果的差异

计算矩阵权重的一个方法
输入的矩阵都是
{ 0,2, 6, 1,-7},
{-2,0,-5, 0,-5}
{-6,5, 0, 8, 1}
{-1,0,-8, 0, 7}
{ 7,5,-1,-7, 0}


这是java的计算代码
static double[] weights=new double weights[5];
private double computeCIandWeights(int[][] matrix) {
double totalWeight = 0;
for (int i = 0; i < weights.length; i++) {
weights[i] = 1;
for (int j = 0; j < weights.length; j++)
weights[i] *= decode(matrix[i][j]);
weights[i] = Math.pow(weights[i], (double)1/weights.length);
totalWeight += weights[i];
}
for (int i = 0; i < weights.length; i++)
weights[i] /= totalWeight;
double eig = 0;
for (int i = 0; i < weights.length; i++) {
double part = 0;
for (int j = 0; j < weights.length; j++)
part += decode(matrix[i][j])*weights[j];
part /= weights[i]*weights.length;
eig += part;
}
return (eig-weights.length)/(weights.length-1);
}

    private double decode(int num) {
        if (num < 0)
            return (double)1/(1-num);
        else
            return num+1;
    }

    然后结果是

CI=0.097302165775079
weights:0.10850015438106028
weights:0.056125161448460546
weights:0.45493710163432743
weights:0.06991685010726335
weights:0.3105207324288884
------------------------------------------------------------------------------------
这是php的计算代码

function computeCIandWeights($matrix,&$weights){
$totalWeight=0.0;
$len=5;
for($i=0;$i<$len;$i++){
$weights[$i]=1;
for($j=0;$j<$len;$j++){
$weights[$i]*=decode($matrix[$i][$j]);
}
$weights[$i]=pow($weights[$i],doubleval(1/$len));
$totalWeight +=doubleval($weights[$i]);
}
for($i=0;$i<$len;$i++){
$weights[$i]/=$totalWeight;
}
$eig=0.0;
for($i=0;$i<$len;$i++){
$part=0.0;
for ($j=0;$j<$len;$j++){
$part+=decode($matrix[$i][$j])*$weights[$j];
}
$part/=$weights[$i]*$len;
$eig+=$part;
}
return ($eig-$len)/($len-1);
}
function decode($num){
if($num<0){
return doubleval(1/(1-$num));
}else{
return $num+1;
}
}

$ci=computeCIandWeights($inputMatrix, $weights);
echo 'ci='.$ci.'.
';
for($i=0;$i
echo 'weights='.$weights[$i].'.
';
}

结果是
ci=0.0973021657751.
weights=0.106290974412.
weights=0.0549823927295.
weights=0.445674092399.
weights=0.0631581840822.
weights=0.329894356377.

权重的计算结果到小数点后第三位就不一样了。
这种误差属于正常吗?
误差产生的原因是不是与浮点数的计算有关?

解决方案

weights[i] = Math.pow(weights[i], (double)1/weights.length);
weights[i] = Math.pow(weights[i], (double)1/(double)weights.length);
否则是整除
别的一样修改

解决方案二:

从c++到Java 之一(47个差异)

时间: 2024-10-31 23:57:44

matrix-java 与 php 计算结果的差异的相关文章

JAVA大数据计算突然变慢

问题描述 JAVA大数据计算突然变慢 计算是从从一个ResultSet中遍历读取(非循环读取),并计算. 之前好好的,突然间程序就跑的很慢很慢-- SQL与程序都没有问题的情况下,到底会是什么问题导致? 跑程序是之前和现在都是用myeclipse直接跑的 真心不知道问题在哪,求好心人提点. 解决方案 cpu如果过热,散热不良,会导致计算机突然减速 计算机中别的进程的运行也会干扰到这个进程的运行. 解决方案二: 排除硬件的前提下: 1)单纯数据查询工具中查询同样SQL是否也数据慢? 慢就是DB的问

用java实现工作时间计算,法定节假日、周末除外

问题描述 用java实现工作时间计算,法定节假日.周末除外 3C 计算工作小时,周末.法定节假日除外,正常时间8小时计算 解决方案 java实现节假日及应休天数计算 解决方案二: http://blog.csdn.net/caodegao/article/details/6732376 解决方案三: 法定节假日,像今年的 9.3 算不算,嘿嘿...固定的节假日,当然可以算法来搞定,最简单的就是枚举出固定的节假日,然后与日历中的日期对比. 解决方案四: 定义一个节假日的数组,获取星期判断是否是1到

JAVA中获取两个字符串差异的方法

问题描述 JAVA中获取两个字符串差异的方法 求助,在编程的过程中碰到这样一个问题,有两个String字符串,然后我需要获取他们之间的差异 String s = {"12345"}; String s1 ={"123645"}; 其中这两个数组的长度可变,s是模板,所有的数组都要和这个数组比较,然后把差异的部分获取出来 所以s1可以是缺了一两个元素的数组,仅仅是单个的字符被替换了,这个可以简单的用字符数组一个一个比较获得,但是如果多一个,或者少一个,这一块我就有点不

利用Java中Calendar计算两个日期之间的天数和周数_java

前言 究竟什么是一个 Calendar 呢?中文的翻译就是日历,那我们立刻可以想到我们生活中有阳(公)历.阴(农)历之分.它们的区别在哪呢? 比如有: 月份的定义 - 阳`(公)历 一年12 个月,每个月的天数各不同:阴(农)历,每个月固定28天 每周的第一天 - 阳(公)历星期日是第一天:阴(农)历,星期一是第一天 实际上,在历史上有着许多种纪元的方法.它们的差异实在太大了,比如说一个人的生日是"八月八日" 那么一种可能是阳(公)历的八月八日,但也可以是阴(农)历的日期.所以为了计时

Java中精确计算的一个类用BigDecimal

这个类确实好用.在网上找到大的,是一个女Java程序员写的.厉害~~~~~~哈哈/* * 创建日期 2004-10-14 * * 如果需要精确计算,非要用String来够造BigDecimal不可 */package com.lims.actions.testqc.comm; /** * @author Jstar * * * 窗口 > 首选项 > Java > 代码生成 > 代码和注释 */import java.math.BigDecimal; /*** 由于Java的简单类型

Java函数2:计算两个日期相差的天数

import java.util.Scanner; public class HelloWorld { public static void main(String[] args){ // Scanner s = new Scanner(System.in); // System.out.println("请输入一个数字"); // int num = s.nextInt(); int SUM = Caluater_date_sub_day(2009,1,25,2008,1,10);

java有没计算每个月几周的方法

问题描述 做个小东西,类似课程表,上面有一行导航栏,显示这个月每周的日期,要求每月第一天如果是上个月最后一周的延续,则显示上个月最后一周,比如2013年9月导航栏显示的信息为2013/08/26-2013/09/012013/09/02-2013/09/082013/09/09-2013/09/152013/09/16-2013/09/222013/09/23-2013/09/292013/09/30-2013/10/06 求请问下java里有没方法可获取每个月有多少周的方法. 问题补充:自己写

java求一时间计算函数

问题描述 求一天内的任何时间至晚上23:59:59秒的剩余时间.返回类型要int返回对应的int使用Datedate=newDate(int)不会出现误差..求解.自己写的有一个没有计算年份只计算了时分秒.返回的时分秒是没问题的.但set到的地方使用date转换后在当前的年份上加了12年..privatestaticintresultTime(SimpleDateFormatsimpleDateFormat)throwsParseException{StringlastTime="23:59:5

Yahoo 开源 Java 超快速计算算法 Data Sketches

Yahoo 今天开源了数据快速高效计算算法,基于 Java 的 Data Sketches 算法. Data Sketches 遵循 Apache 开源授权协议提供在 GitHub:github.com/datasketches/sketches-core/. 这类型的技术在研究者的学术论文中出现的越来越多,总是使用不同的名字,但都会分享一些关键的技术点.首先就是可以处理流数据,因为这些数据他们只接触一次.他们是可附加的,你可以添加或者合并这些计算.更有趣的是,他们都是近似的. 雅虎方面发表声明