Java 2d数组比较

Java 2d数组比较,java,arrays,loops,2d,Java,Arrays,Loops,2d,您好,我想问一个关于2d数组中比较的问题。 我有以下2d数组,每行有两个参数。 我想比较前5行(即周期0)和第5行(即周期1) 我想比较一下 比较将是一行一行作为一维数组我需要两个一维数组来相互比较 榜样 时段0(第0行)与时段1(第0行、第1行、第2行、第3行、第4行) 时段0第1行与时段1(第0行、第1行、第2行、第3行、第4行) 时段0第2行与时段1(第0行、第1行、第2行、第3行、第4行) 时段0第3行与时段1(第0行、第1行、第2行、第3行、第4行) 时段0第4行与时段1(第0行、第1

您好,我想问一个关于2d数组中比较的问题。 我有以下2d数组,每行有两个参数。 我想比较前5行(即周期0)和第5行(即周期1) 我想比较一下 比较将是一行一行作为一维数组我需要两个一维数组来相互比较

榜样

时段0(第0行)与时段1(第0行、第1行、第2行、第3行、第4行)

时段0第1行与时段1(第0行、第1行、第2行、第3行、第4行)

时段0第2行与时段1(第0行、第1行、第2行、第3行、第4行)

时段0第3行与时段1(第0行、第1行、第2行、第3行、第4行)

时段0第4行与时段1(第0行、第1行、第2行、第3行、第4行)


然后

时段1第0行与时段2(第0行、第1行、第2行、第3行、第4行)

时段1第1行与时段2(第0行、第1行、第2行、第3行、第4行)

时段1第2行与时段2(第0行、第1行、第2行、第3行、第4行)

时段1第3行与时段2(第0行、第1行、第2行、第3行、第4行)

时段1第4行与时段2(第0行、第1行、第2行、第3行、第4行)


然后

时段2第0行与时段3(第0行、第1行、第2行、第3行、第4行)

时段2第1行与时段3(第0行、第1行、第2行、第3行、第4行)

时段2第2行与时段3(第0行、第1行、第2行、第3行、第4行)

时段2第3行与时段3(第0行、第1行、第2行、第3行、第4行)

时段2第4行与时段3(第0行、第1行、第2行、第3行、第4行)


我的目标是获取周期0的第一行,然后将其转换为1d数组,然后获取周期1的第一行,然后将其转换为1d数组,依此类推

二维阵列如下所示

double[]myDistributions=新的double[]{

        row0 {0.15250886479593964,0.2610516793197853,0.11441768814194446,0.1265241345428162,0.3454976331995246},
        row1 {0.14389124837314887,0.10513281153155449,0.1833462741873425,0.36788054102686596,0.1997491248810186},
Period0 row2 {0.1111207312911868,0.17499901413730568,0.2914581757577288,0.20433331657432438,0.2180887622394655},
        row3 {0.0948730457966342,0.19288720600625753,0.19471332499886804,0.18018001280247228,0.3373464103957629},
        row4 {0.18877271931210932,0.26521449714587747,0.13230019262559328,0.27631809895720494,0.13739449195931552},

        row0 {0.1274517393962726,0.10526928843184565,0.35751329613481436,0.12240396832200726,0.2873617077151316},
        row1 {0.3016290729137225,0.09902028076323677,0.17515717333485062,0.35620664945852193,0.06798682352968743},
Period1 row2 {0.0948730457966342,0.19288720600625753,0.19471332499886804,0.18018001280247228,0.3373464103957629},
        row3 {0.18877271931210932,0.26521449714587747,0.13230019262559328,0.27631809895720494,0.13739449195931552},
        row4 {0.17804585265772793,0.25651982583759037,0.3860867129515085,0.09453797159458521,0.08480963695844175},

        row0 {0.2311120677942418,0.07901250493611567,0.15795189397863776,0.24546018732208122,0.28646334596884354},
        row1 {0.08823944830766299,0.26313933789756516,0.10406419933285384,0.3365866979847223,0.20797031647719286},
Period2 row2 {0.1274517393962726,0.10526928843184565,0.35751329613481436,0.12240396832200726,0.2873617077151316},
        row3 {0.3016290729137225,0.09902028076323677,0.17515717333485062,0.35620664945852193,0.06798682352968743},
        row4 {0.11962680738039468,0.1590225091909952,0.24009305610431117,0.11189649648370673,0.36936113084052996},

        row0 {0.17804585265772793,0.25651982583759037,0.3860867129515085,0.09453797159458521,0.08480963695844175},
        row1 {0.08823944830766299,0.26313933789756516,0.10406419933285384,0.3365866979847223,0.20797031647719286},
Period3 row2 {0.1274517393962726,0.10526928843184565,0.35751329613481436,0.12240396832200726,0.2873617077151316},
        row3 {0.0948730457966342,0.19288720600625753,0.19471332499886804,0.18018001280247228,0.3373464103957629},
        row4 {0.3962773409768214,0.12002724792315751,0.15722439889764284,0.11854502459707339,0.20792598760527947}};
我找到了解决办法

int numOfTopicsInEachPeriod=5;

double[][] myFirstRow=new  double [numOfTopicsInEachPeriod][myDistributions[0].length];
double[][] mySecondRow=new double[numOfTopicsInEachPeriod][myDistributions[0].length];


int count =0;
int counter =0;
int temp=0;

for(int j =0;j<myDistributions.length-numOfTopicsInEachPeriod;j++){

   int mod=j%numOfTopicsInEachPeriod;
   int countOfTopics = j/numOfTopicsInEachPeriod;
   count=0;

   if(mod==0){
       temp=1;
       count=numOfTopicsInEachPeriod* countOfTopics; 

   }

   if(temp==1&&mod!=0){count=numOfTopicsInEachPeriod* countOfTopics; }

     for(int i=counter;i<numOfTopicsInEachPeriod;i++){

       myFirstRow[i]=myDistributions[count];
       mySecondRow[i]=myDistributions[count+5];

       System.out.print("myFunction(Row["+j+"],Row ["+(count+5)+"]),"+"\t" );

       count++;

   }

   System.out.println();
}
int numotopicsineachperiod=5;
double[][]myFirstRow=新的双精度[numOfTopicsInEachPeriod][myDistributions[0]。长度];
double[]mySecondRow=new double[numotopicsineachperiod][myDistributions[0].length];
整数计数=0;
int计数器=0;
内部温度=0;

因为(int j=0;j既然你在一篇评论中提到了你在做什么,我们可以理解你在这里想要实现什么。坦率地说,没有任何不尊重,你的解释很糟糕。:p

按照我收集的方式,您正在尝试从两个特定的二维(2D)中获取行双类型数组并从那些特定的双类型数据行中检索分歧值。当然,您还没有透露分歧的类型。如果您这样做,我将不得不假设它是一个。无论哪种方式,您都可以使用我在下面提供的代码,并对其进行修改,以调用您希望收集所需分歧的任何Java方法

为了完成这项任务,我们需要两种特定的方法,其中最重要的一种当然是为我们提供分歧的方法。我下面提供的方法就是这样做的,它是由马萨诸塞州阿默斯特大学计算机科学系的Charles Sutton不久前写的方法是“MALLET”(MALLET)的一部分。以下是开源的:

/**
* Returns the Kullback–Leibler (KL) Divergence, K(p1 || p2).
*
* The log is w.r.t. base 2. <p>
*
* *Note*: If any value in <tt>p2</tt> is <tt>0.0</tt> then the KL-divergence
* is <tt>infinite</tt>. Limin changes it to zero instead of infinite. 
* 
*/
public static double klDivergence(double[] p1, double[] p2) {
    double log2 = Math.log(2);
    double klDiv = 0.0;

    for (int i = 0; i < p1.length; ++i) {
        if (p1[i] == 0) { continue; }
        if (p2[i] == 0.0) { continue; } // Limin

        klDiv += p1[i] * Math.log( p1[i] / p2[i] );
    }

    return klDiv / log2; // moved this division out of the loop -DM
}
现在我们需要做的就是调用我们的kldFromDoubleArrays()方法来处理所需的时段。在帖子中,您指定要处理的行为:

  • 周期0的每一行与周期1的每一行相对
  • 周期1的每一行与周期2的每一行相对
  • 周期2的每一行与周期3的每一行相对
因此,知道了这一点,我们将调用我们的方法三次:

//Create a Underline for Console window display.
String ul = String.join("", Collections.nCopies(100, "=")) + "\n";

//Period0 To Period1 Comparison:
kldFromDoubleArrays(period0, "Period 0", period1, "Period 1");
System.out.println(ul);

//Period1 To Period2 Comparison:
kldFromDoubleArrays(period1, "Period 1", period2, "Period 2");
System.out.println(ul);

//Period2 To Period3 Comparison:
kldFromDoubleArrays(period2, "Period 2", period3, "Period 3");
System.out.println(ul);
以下是一些示例输出:

The Divergence between Row 2 of Period 0 and Row 1 of Period 1 is: -->  -0.16008580289377392
The Divergence between Row 2 of Period 0 and Row 1 of Period 1 is: -->  -0.16008580289377392
The Divergence between Row 2 of Period 0 and Row 1 of Period 1 is: -->  -0.16008580289377392
The Divergence between Row 2 of Period 0 and Row 1 of Period 1 is: -->  -0.16008580289377392
The Divergence between Row 2 of Period 0 and Row 1 of Period 1 is: -->  -0.16008580289377392
The Divergence between Row 2 of Period 0 and Row 2 of Period 1 is: -->  0.025341952815786797
The Divergence between Row 2 of Period 0 and Row 2 of Period 1 is: -->  0.025341952815786797
The Divergence between Row 2 of Period 0 and Row 2 of Period 1 is: -->  0.025341952815786797
The Divergence between Row 2 of Period 0 and Row 2 of Period 1 is: -->  0.025341952815786797
The Divergence between Row 2 of Period 0 and Row 2 of Period 1 is: -->  0.025341952815786797
The Divergence between Row 2 of Period 0 and Row 3 of Period 1 is: -->  -0.08495427575998642
The Divergence between Row 2 of Period 0 and Row 3 of Period 1 is: -->  -0.08495427575998642
The Divergence between Row 2 of Period 0 and Row 3 of Period 1 is: -->  -0.08495427575998642

到此为止。我希望这对您有所帮助。祝您的项目好运。

我不太明白您希望如何比较每一行。您想要实现什么类型的比较(等于、大于、小于、在范围内、全部)?感谢Jacob G的回复,我假设第一个5行是我的周期0,第二个5行是我的周期1,第三个5行是我的周期2,剩下的5行是我的周期3。我有一个函数,它获取2 1d数组作为输入。因此,首先我的函数输入是(周期0行0)和(周期1行0)您不需要签名
newdouble[]
当您像那样初始化它时,感谢您的回复,我有一个比较函数,该函数获取2个1d数组作为输入。因此,我会将每个1d数组我的意思是行发送到该函数Period0 row0 vs Period1 row0 Period0 vs Period1 row1 Period0 row0 vs Period1 row2 Period0 row0 vs Period1 row3周期0第0行vs周期1第4行---谢谢:)ım使用mallet方法,但我有一个问题,我的周期是动态的,我可能有数百个周期,所以我不能创建这样的周期,这真的很奇怪……因为我没有创建它们……你在最初的帖子中创建了。这真的不重要,因为你可以将你喜欢的任何2D双类型数组传递给KLDFromDoubleArray()方法,只要它们在两个数组中都包含相同数量的列。听起来您需要的是帮助从您正在接收的特定双类型数据创建1D或2D数组…我不确定,因为此时我仍然不清楚您的实际需求是什么。为了进一步帮助您,我需要了解一些真实的需求数据,以及你想用它做什么。你想处理的数据是以稳定的流的形式输入的,并且在接收时需要实时发散吗?或者,它是以数据文件的形式输入的吗?我不知道…现在只是猜测一下。我从数据库中填充这个矩阵,我只是在这里制作了一个示例。我在mallet中使用主题建模,我有5个topic在上面的矩阵中,我的意思是,每个周期的前5行指周期0,周期0的第一行指主题0,第二个主题1等等。然后周期1的主题相同,我想我理解你在这里想说什么。所以,你从数据库表(或多个表)中提取这些数据使用一些SQL查询,现在需要将该查询的结果集放入2D双类型数组中
//Create a Underline for Console window display.
String ul = String.join("", Collections.nCopies(100, "=")) + "\n";

//Period0 To Period1 Comparison:
kldFromDoubleArrays(period0, "Period 0", period1, "Period 1");
System.out.println(ul);

//Period1 To Period2 Comparison:
kldFromDoubleArrays(period1, "Period 1", period2, "Period 2");
System.out.println(ul);

//Period2 To Period3 Comparison:
kldFromDoubleArrays(period2, "Period 2", period3, "Period 3");
System.out.println(ul);
The Divergence between Row 2 of Period 0 and Row 1 of Period 1 is: -->  -0.16008580289377392
The Divergence between Row 2 of Period 0 and Row 1 of Period 1 is: -->  -0.16008580289377392
The Divergence between Row 2 of Period 0 and Row 1 of Period 1 is: -->  -0.16008580289377392
The Divergence between Row 2 of Period 0 and Row 1 of Period 1 is: -->  -0.16008580289377392
The Divergence between Row 2 of Period 0 and Row 1 of Period 1 is: -->  -0.16008580289377392
The Divergence between Row 2 of Period 0 and Row 2 of Period 1 is: -->  0.025341952815786797
The Divergence between Row 2 of Period 0 and Row 2 of Period 1 is: -->  0.025341952815786797
The Divergence between Row 2 of Period 0 and Row 2 of Period 1 is: -->  0.025341952815786797
The Divergence between Row 2 of Period 0 and Row 2 of Period 1 is: -->  0.025341952815786797
The Divergence between Row 2 of Period 0 and Row 2 of Period 1 is: -->  0.025341952815786797
The Divergence between Row 2 of Period 0 and Row 3 of Period 1 is: -->  -0.08495427575998642
The Divergence between Row 2 of Period 0 and Row 3 of Period 1 is: -->  -0.08495427575998642
The Divergence between Row 2 of Period 0 and Row 3 of Period 1 is: -->  -0.08495427575998642