Reputation:
I am trying to make a matrix that populates 1 across the main diagonal. When I run the code it populates the entire matrix with 1's. The array initializes to 0's, which is working correctly.
var zeroMatrix = function(n) {
var matrix = [];
var row = [];
for(var i = 0; i < n; i++){
row.push(0);
}
for(var i = 0; i < n; i++){
matrix.push(row);
}
return matrix;
};
var diagOne = function(n) {
var matrix = zeroMatrix(n);
for(var i = 0; i < n; i++){
matrix[i][i] = 1;
}
return matrix;
};
console.log(diagOne(4));
Upvotes: 2
Views: 39
Reputation: 12181
Here you go with one more solution https://jsfiddle.net/ggefdtzL/
var diagOne = function(n) {
var matrix = [];
for(var i = 0; i < n; i++){
var row = [];
for(var j=0; j<n; j++){
row.push(0);
if(i === j){
row[i] = 1;
}
}
matrix.push(row);
}
return matrix;
};
console.log(diagOne(4));
Advantage of this code, it will reduce an extra loop that you are performing to convert 0 to 1 in diagOne method.
Upvotes: 0
Reputation: 6923
You issue was that you where pushing the same row in each loop.
You can build a new row in each loop or you need to make a copy of it.
var zeroMatrix = function(n) {
var matrix = [];
for(var j = 0; j < n; j++)
{
var row = [];
for(var i = 0; i < n; i++){
row.push(0);
}
matrix.push(row);
}
return matrix;
};
var diagOne = function(n) {
var matrix = zeroMatrix(n);
for(var i = 0; i < n; i++){
matrix[i][i] = 1;
}
return matrix;
};
console.log(diagOne(4));
You can construct a new array as well:
var zeroMatrix = function(n) {
var matrix = [];
for(var j = 0; j < n; j++)
{
matrix.push(Array(n).fill(0));
}
return matrix;
};
var diagOne = function(n) {
var matrix = zeroMatrix(n);
for(var i = 0; i < n; i++){
matrix[i][i] = 1;
}
return matrix;
};
console.log(diagOne(4))
;
Upvotes: 0
Reputation: 9808
This is because you are pushing the same row n times into the matrix, this makes each element of matrix contain reference to the same row. Now, in diagOne(), you are changing elements over the same row and end up getting all ones in the matrix.
You will need to make new rows for every element in matrix. You can do something like
var zeroMatrix = function(n) {
var matrix = [];
var row = [];
for(var i = 0; i < n; i++){
var row = [];
for(var j = 0; j < n; j++){
row.push(0);
}
matrix.push(row);
}
return matrix;
};
var diagOne = function(n) {
var matrix = zeroMatrix(n);
for(var i = 0; i < n; i++){
matrix[i][i] = 1;
}
return matrix;
};
console.log(diagOne(4));
Upvotes: 0
Reputation: 1
.push()
row.slice(0)
, which creates a copy of row
array, to matrix
array
var zeroMatrix = function(n) {
var matrix = [];
var row = [];
for(var i = 0; i < n; i++){
row.push(0);
}
for(var i = 0; i < n; i++){
matrix.push(row.slice(0));
}
return matrix;
};
var diagOne = function(n) {
var matrix = zeroMatrix(n);
for(var i = 0; i < n; i++){
matrix[i][i] = 1;
}
return matrix;
};
console.log(diagOne(4));
Upvotes: 1