javascript - 为什么二维数组在生成后被重写
问题描述
我有方法 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)
}
}
}
解决方案
问题是,浏览器控制台会在数组因代码而更改时对其进行调整。至少只要您不克隆它并破坏对它的引用。
试试你的console.log()
这种方式:
console.log('On this log I expect to get generated values: ', JSON.parse(JSON.stringify(this.weights)));
这样做你会在调用之前看到它的原始状态learn()
。
推荐阅读
- php - Symfony 5 - 如何从一对一关系向表单添加字段?
- node.js - Node js Express 多次执行单个调用
- python - 警告:此运行时之前已导入以下包:[PIL] 您必须重新启动运行时才能使用新安装的版本
- jquery - 如何在选择复选框、单选按钮等时执行事件
- python - 尝试使用带有并发期货的等待来附加到数据帧并在大约 90% 的时间里得到一个关键错误
- keycloak - 将 Bearer 令牌从 kong 传递给 keycloak 进行身份验证,然后进行 api 调用
- php - 显示除刀片中选定错误之外的所有错误
- mlr3 - mlr3 中的 CV 或训练/预测
- html - 如何将页脚放在页面底部?
- c++ - 错误:“无法推断模板参数 '_Tp'” 将 {} 传入