for (int p = 0; p < tch.size(); p++) { //tch.size() = 4; boolean test = true; while (test) { ArrayList<ArrayList<Double>> out = new ArrayList<ArrayList<Double>>(); out = calcOutput(tch.get(p)); for (int i = 0; i < numHidden + numOutput; i++) { test = test && empty[p][i]; } if (test == true) {//只有out中所有元素不空,才向all中添加 all.add(p,out); break; } } } 针对每一个p(for循环),在while中计算一个对应的out(红色部分),用test测试out中所有数组元素都非空后将out值传入all对应p中,跳出while,继续下一次的p+1。我现在把while中的out的声明和calcOutput计算挪在while执行之前并将all.add挪出在while执行之后,调试程序仍然不成功,all的所有元素仍然被最终元素覆盖。
把代码先简化下吧,你这个while有什么用?删了吧。
ArrayList<ArrayList<ArrayList<Double>>> all = new ArrayList<ArrayList<ArrayList<Double>>>();while中跟问题关系不大的内容没有写上来, while功能是: 只要out有元素为空,就继续循环,每次循环修改的参数(未写出)将在calcOutput中被调用,以重新计算out
ArrayList<ArrayList<Double>> out = new ArrayList<ArrayList<Double>>(); //第一句确实new了 out = calcOutput(tch.get(p)); //第二句你有把out给重新赋值了结论:根本不是new的问题了,而是这个方法calcOutput(tch.get(p)) 返回的对象都是同一个对象了 所以all里面的值都是一样的值了
我想问一下,你这里out是新new出来的,也就是说传进去的参数out本来就是不含任何元素的,你是怎么在 out = calcOutput(tch.get(p))方法中检测out里面所有的元素的?我早就说过 问题出在calcOutput这个方法里面 它每一次返回的都是对用一个ArrayList的引用,然后这个引用又赋值给out,最后被all.add(out)进去,无论你在哪里new out,都是没有意义的,因为calcOutput这个方法返回的始终是同一个引用!
先上传while的完整的方法如下。我去想想calcOutput方法,不懂再来讨教。 while (test) { ArrayList<ArrayList<Double>> out = new ArrayList<ArrayList<Double>>(); out = calcOutput(tch.get(p)); for (int h = 0; h < numHidden; h++) { if (out.get(h + numInput).isEmpty()) { for (int i = 0; i < numInput; i++) { for (int k = 0; k < numSubConnection; k++) { weight[indexHI(h, i, k)] += 0.1; } } } else { empty[p][h] = true; } }
--〉省略numOutput部分,内容与numHidden相似〈--
没开出来是在哪里检查out的元素不为空的 ArrayList<ArrayList<Double>> out = new ArrayList<ArrayList<Double>>(calcOutput(tch.get(p))); 能让你的out是新的对象,里面的元素是calcOutput(tch.get(p))所返回的对象的元素
先上传while的完整的方法如下。我去想想calcOutput方法,不懂再来讨教。 while (test) {//test预先赋值为true ArrayList<ArrayList<Double>> out = new ArrayList<ArrayList<Double>>(); out = calcOutput(tch.get(p)); //下面是out的元素结构,只为完整贴出来,不需要细看 for (int h = 0; h < numHidden; h++) { if (out.get(h + numInput).isEmpty()) { for (int i = 0; i < numInput; i++) { for (int k = 0; k < numSubConnection; k++) { weight[indexHI(h, i, k)] += 0.1;//calcOutput中用到的计算参数,大小影响out是否有空及其它 } } } else { empty[p][h] = false;//empty数组初始赋值为true,若有空数组,该对应位置改为false } }--〉省略numOutput部分,内容与numHidden相似〈--
//判断test,为false for (int i = 0; i < numHidden + numOutput; i++) { test = test && empty[p][i];//若test最终为false,说明out有空数组,while循环重新更改参数weight[]数组 } if (test == falsetrue) { test = true; } }
calcOutput方法如下: ArrayList<ArrayList<Double>> calcOutput(ArrayList<ArrayList<Double>> input) throws Exception { ArrayList<ArrayList<Double>> out = new ArrayList<ArrayList<Double>>(); //out添加1 for (int i = 0; i < numInput; i++) { if (input.get(i) == null) { System.out.println("Error!" + i); } out.add(input.get(i)); } //out添加2,用到weight参数。weight参数已声明为全局变量 for (int h = 0; h < numHidden; h++) { ArrayList<UnitInput> in = new ArrayList<UnitInput>(0); for (int i = 0; i < numInput; i++) { for (int f = 0; f < out.get(i).size(); f++) { for (int k = 0; k < numSubConnection; k++) { in.add(new UnitInput(out.get(i).get(f), weight[indexHI(h, i, k)], delay(k))); } } } out.add(unit[h].calcOutput(in)); //output from hidden layer } //out添加3,与2基本一致 for (int o = 0; o < numOutput; o++) { ArrayList<UnitInput> in = new ArrayList<UnitInput>(0); for (int h = 0; h < numHidden; h++) { for (int f = 0; f < out.get(numInput + h).size(); f++) { for (int s = 0; s < numSubConnection; s++) { in.add(new UnitInput(out.get(numInput + h).get(f), weight[indexOH(o, h, s)], delay(s))); } } } out.add(unit[numHidden + o].calcOutput(in)); } //1,2,3全体为ArrayList<ArrayList<Double>> out的元素 return out; }
因为out又被重新赋值了
要看你的calcOutput方法是怎么实现的,在里面new才是正确的选择
ArrayList<ArrayList<Double>> out = new ArrayList<ArrayList<Double>>(tch.get(p));
但是因为有可能有空值,
所以后面简单判断之后,
将全部元素都非空的out传递给all[p]。问题便是,新传递给all的值将原有值替换并追加进去了,
虽然all在增大,但各元素值却一样。
我的new该放到哪里么
out一直没有改变过,add到all里面,当然元素都是一样的了
boolean test = true;
while (test) {
ArrayList<ArrayList<Double>> out = new ArrayList<ArrayList<Double>>();
out = calcOutput(tch.get(p));
for (int i = 0; i < numHidden + numOutput; i++) {
test = test && empty[p][i];
}
if (test == true) {//只有out中所有元素不空,才向all中添加
all.add(p,out); break;
}
}
}
针对每一个p(for循环),在while中计算一个对应的out(红色部分),用test测试out中所有数组元素都非空后将out值传入all对应p中,跳出while,继续下一次的p+1。我现在把while中的out的声明和calcOutput计算挪在while执行之前并将all.add挪出在while执行之后,调试程序仍然不成功,all的所有元素仍然被最终元素覆盖。
while功能是:
只要out有元素为空,就继续循环,每次循环修改的参数(未写出)将在calcOutput中被调用,以重新计算out
假如当p=0,test=true,all.add(0,out);
假如当p=1,test=false,all不添加。
假如当p=2,test=true,all.add(2,out);这样不会出现异常吗?还是说all在别的地方有啥特殊操作?
out = calcOutput(tch.get(p)); //第二句你有把out给重新赋值了结论:根本不是new的问题了,而是这个方法calcOutput(tch.get(p)) 返回的对象都是同一个对象了
所以all里面的值都是一样的值了
我想问一下,你这里out是新new出来的,也就是说传进去的参数out本来就是不含任何元素的,你是怎么在
out = calcOutput(tch.get(p))方法中检测out里面所有的元素的?我早就说过 问题出在calcOutput这个方法里面 它每一次返回的都是对用一个ArrayList的引用,然后这个引用又赋值给out,最后被all.add(out)进去,无论你在哪里new out,都是没有意义的,因为calcOutput这个方法返回的始终是同一个引用!
while (test) {
ArrayList<ArrayList<Double>> out = new ArrayList<ArrayList<Double>>();
out = calcOutput(tch.get(p));
for (int h = 0; h < numHidden; h++) {
if (out.get(h + numInput).isEmpty()) {
for (int i = 0; i < numInput; i++) {
for (int k = 0; k < numSubConnection; k++) {
weight[indexHI(h, i, k)] += 0.1;
}
}
} else {
empty[p][h] = true;
}
}
ArrayList<ArrayList<Double>> out = new ArrayList<ArrayList<Double>>(calcOutput(tch.get(p)));
能让你的out是新的对象,里面的元素是calcOutput(tch.get(p))所返回的对象的元素
while (test) {//test预先赋值为true ArrayList<ArrayList<Double>> out = new ArrayList<ArrayList<Double>>();
out = calcOutput(tch.get(p)); //下面是out的元素结构,只为完整贴出来,不需要细看 for (int h = 0; h < numHidden; h++) {
if (out.get(h + numInput).isEmpty()) {
for (int i = 0; i < numInput; i++) {
for (int k = 0; k < numSubConnection; k++) {
weight[indexHI(h, i, k)] += 0.1;//calcOutput中用到的计算参数,大小影响out是否有空及其它 }
}
} else {
empty[p][h] = false;//empty数组初始赋值为true,若有空数组,该对应位置改为false }
}--〉省略numOutput部分,内容与numHidden相似〈--
//判断test,为false
for (int i = 0; i < numHidden + numOutput; i++) {
test = test && empty[p][i];//若test最终为false,说明out有空数组,while循环重新更改参数weight[]数组 }
if (test == falsetrue) {
test = true;
}
}
ArrayList<ArrayList<Double>> calcOutput(ArrayList<ArrayList<Double>> input) throws Exception {
ArrayList<ArrayList<Double>> out = new ArrayList<ArrayList<Double>>();
//out添加1
for (int i = 0; i < numInput; i++) {
if (input.get(i) == null) {
System.out.println("Error!" + i);
}
out.add(input.get(i));
}
//out添加2,用到weight参数。weight参数已声明为全局变量
for (int h = 0; h < numHidden; h++) {
ArrayList<UnitInput> in = new ArrayList<UnitInput>(0);
for (int i = 0; i < numInput; i++) {
for (int f = 0; f < out.get(i).size(); f++) {
for (int k = 0; k < numSubConnection; k++) {
in.add(new UnitInput(out.get(i).get(f), weight[indexHI(h, i, k)], delay(k)));
}
}
}
out.add(unit[h].calcOutput(in)); //output from hidden layer
}
//out添加3,与2基本一致
for (int o = 0; o < numOutput; o++) {
ArrayList<UnitInput> in = new ArrayList<UnitInput>(0);
for (int h = 0; h < numHidden; h++) {
for (int f = 0; f < out.get(numInput + h).size(); f++) {
for (int s = 0; s < numSubConnection; s++) {
in.add(new UnitInput(out.get(numInput + h).get(f), weight[indexOH(o, h, s)], delay(s)));
}
}
}
out.add(unit[numHidden + o].calcOutput(in));
}
//1,2,3全体为ArrayList<ArrayList<Double>> out的元素
return out;
}
我不熟悉引用问题,应该设4个out_abcd还是怎么做?
在calcOutput方法里new是什么意思,calcOutput方法里有new...