Java 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行、第2行、第3行、第4行)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
然后 时段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