首页 > 解决方案 > 为什么二维数组在生成后被重写

问题描述

我有方法 generateWeights() 用于获取数组中的随机值;调用方法 changeWeights() 的方法 learn() 更改数组上的值。

预期:在 console.log() 上调用方法 learn() 之前,我将得到随机值的数组

实际上:在这个 console.log 上,我已经从方法 changeWeights() 的下一行中排列了

代码:

import {Injectable} from '@angular/core';
import {Letters} from "../constnants/letters";
import {Alphabet} from "../constnants/alphabet";
import {GeneralWeights} from "../constnants/weights";

@Injectable({
  providedIn: 'root'
})
export class LearningService {
  public theta: number = 0;
  letters = new Array<number[][]>();
  d: number = 0;
  weights: number[][] = [[]];

  constructor() {
    this.initTheta();

    this.initArrays();

    this.weights = this.generateWeights(7, 5);
    
    console.log('On this log I expect to get generated values: ', this.weights);

    this.learn();
  }

  public learn(): void {

    for (let n = 0; n < Alphabet.ALPHABET.length; n++) {
      let counter;
      while (true) {
        counter = n;
        for (let i = n; i < Alphabet.ALPHABET.length; i++) {

          this.d = Alphabet.ALPHABET[i] === Alphabet.ALPHABET[n] ? 1 : 0;

          console.log("checking ", Alphabet.ALPHABET[i], ': ');
          const x = this.letters[i];
          const res: boolean = this.isRight(this.getSum(x));

          if ((i !== n  && res) || (i === n && !res)) {
            i--;
            this.changeWeights(x, res, this.d);

            console.log('');
          } else {
            GeneralWeights.WEIGHTS.push(this.weights);
            counter++;
          }
          if(counter === 33) {
            console.log(GeneralWeights.WEIGHTS);
            return;
          }
        }
      }
    }

  }

  comparisonSum(twoDimensionalArray: number[][], index: number): number {
    let sum = 0, i = 0, j = 0;
    twoDimensionalArray.forEach(array => {
      j = 0;
      array.forEach(item => {
        i = 0;
        sum += item * GeneralWeights.WEIGHTS[index][i][j];
        j++;
      })
      i++;
    })
    return sum;
  }

  generateWeights(rows: number, cols: number): number[][] {
    return Array.from({ length: rows }).map(() =>
      Array.from({ length: cols }).map(() => Math.random())
    );
  }

  public getSum(x: number[][]): number{
    let sum = 0;
    for (let i = 0; i < 7; i++){
      for (let j = 0; j < 5; j++){
        sum += x[i][j] * this.weights[i][j];
      }
    }
    console.log("sum = ", sum);
    return sum;
  }

  public isRight(sum: number): boolean {
    return sum >= this.theta;
  }

  private changeWeights(x: number[][], y: boolean, d: number): void {
    console.log("New weights: ");
    let ni = 2.5;
    let e = d - (y ? 1 : 0);

    for (let i = 0; i < 7; i++) {
      for (let j = 0; j < 5; j++) {
        // this.weights[i][j] += ni * e * x[i][j];
        this.weights[i][j] = 0;

      }
    }
    console.log(this.weights);
  }

  private initTheta(): void {
    this.theta = Math.random() * 2 -1;
    console.log('θ = ', this.theta);
    console.log('');
  }

  private initArrays(): void {
    for (let letters of Letters.LETTERS) {
      this.letters.push(letters)
    }
  }

}

标签: javascriptarraysangulartypescript

解决方案


问题是,浏览器控制台会在数组因代码而更改时对其进行调整。至少只要您不克隆它并破坏对它的引用。

试试你的console.log()这种方式:

console.log('On this log I expect to get generated values: ', JSON.parse(JSON.stringify(this.weights)));

这样做你会在调用之前看到它的原始状态learn()


推荐阅读