本帖最后由 java_PNN 于 2011-06-10 10:04:24 编辑

解决方案 »

  1.   

    你这里new了等于没new。
    因为out又被重新赋值了
    要看你的calcOutput方法是怎么实现的,在里面new才是正确的选择
      

  2.   

    要这样new
    ArrayList<ArrayList<Double>> out = new ArrayList<ArrayList<Double>>(tch.get(p)); 
      

  3.   

    从这段代码上看没什么问题,就是不知道你的逻辑是否正确,debug一下吧..........
      

  4.   

    all.add(p,out);,在指定位置插入元素,会不会是你的索引p有问题?
      

  5.   

    回复2楼:calcOutput是往out中赋值的方法,out = calcOutput(tch.get(p));  通过test判断out不空后将out作为all的一个元素,然后继续for;若out中有空数组,则继续while循环。回复3楼:不行
      

  6.   

    ArrayList<ArrayList<Double>> out = new ArrayList<ArrayList<Double>>(calcOutput(tch.get(p)));
      

  7.   

    calcOutput方法将计算的值放入out中,
    但是因为有可能有空值,
    所以后面简单判断之后,
    将全部元素都非空的out传递给all[p]。问题便是,新传递给all的值将原有值替换并追加进去了,
    虽然all在增大,但各元素值却一样。
    我的new该放到哪里么
      

  8.   

    没明白你的意思?
    out一直没有改变过,add到all里面,当然元素都是一样的了
      

  9.   

    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的所有元素仍然被最终元素覆盖。
      

  10.   

    把代码先简化下吧,你这个while有什么用?删了吧。
      

  11.   

    ArrayList<ArrayList<ArrayList<Double>>> all = new ArrayList<ArrayList<ArrayList<Double>>>();while中跟问题关系不大的内容没有写上来,
    while功能是:
    只要out有元素为空,就继续循环,每次循环修改的参数(未写出)将在calcOutput中被调用,以重新计算out
      

  12.   

    我的理解是这样的,现在p取值为0, 1, 2, 3,all又是一个空list。
    假如当p=0,test=true,all.add(0,out);
    假如当p=1,test=false,all不添加。
    假如当p=2,test=true,all.add(2,out);这样不会出现异常吗?还是说all在别的地方有啥特殊操作?
      

  13.   

    ArrayList<ArrayList<Double>> out = new ArrayList<ArrayList<Double>>(); //第一句确实new了
     out = calcOutput(tch.get(p)); //第二句你有把out给重新赋值了结论:根本不是new的问题了,而是这个方法calcOutput(tch.get(p)) 返回的对象都是同一个对象了
    所以all里面的值都是一样的值了
      

  14.   


    我想问一下,你这里out是新new出来的,也就是说传进去的参数out本来就是不含任何元素的,你是怎么在
    out = calcOutput(tch.get(p))方法中检测out里面所有的元素的?我早就说过  问题出在calcOutput这个方法里面  它每一次返回的都是对用一个ArrayList的引用,然后这个引用又赋值给out,最后被all.add(out)进去,无论你在哪里new out,都是没有意义的,因为calcOutput这个方法返回的始终是同一个引用!
      

  15.   

    先上传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相似〈--
      

  16.   

    没开出来是在哪里检查out的元素不为空的
    ArrayList<ArrayList<Double>> out = new ArrayList<ArrayList<Double>>(calcOutput(tch.get(p)));
    能让你的out是新的对象,里面的元素是calcOutput(tch.get(p))所返回的对象的元素
      

  17.   

    先上传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;
      }
      }
      

  18.   

    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;
        }
      

  19.   

    把你new的那个对象放到while外面呢?是什么情况。我是从对象的角度来考虑,没循环一次,这是一个新的对象,每次的值都不一样啊,最后的对象只有最后一次的值。
      

  20.   

    你好。
    我不熟悉引用问题,应该设4个out_abcd还是怎么做?
    在calcOutput方法里new是什么意思,calcOutput方法里有new...