user8210822
user8210822

Reputation:

2d array always populates entire array when trying to populate only the diagonal

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

Answers (4)

Shiladitya
Shiladitya

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

Alexander Higgins
Alexander Higgins

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

Dij
Dij

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

guest271314
guest271314

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

Related Questions