6

I tried to use Typed arrays instead of arrays, to reduce memory:

function createarrayInt8(numrows,numcols,number){
       
 var arr = new Int8Array(numrows);
         
 for (var i = 0; i < numrows; ++i){
  var columns = new Int8Array(numcols);
  for (var j = 0; j < numcols; ++j){
   columns[j] = number;
  }
  arr[i] = columns;
 }
  
 return arr; 
}

But i can't create multidimensional Typed array. Why? Do i have to cast only the "number" var to Int8?

Matthias Ma
  • 103
  • 1
  • 6
  • 1
    Well, a typed array can only store values of its type. A uint8 array can therefore only store unsigned 8 bit integers, but not arrays (of uints). – le_m Jul 14 '16 at 18:18
  • i almost thought so :). But how can it get a multidimensional array that stores only unsigned 8 bit integers to reduce the used memory? – Matthias Ma Jul 14 '16 at 18:25

1 Answers1

9

A typed Int8Array can only hold 8-bit integers. So arr[i] = columns won't work since columns is of type Int8Array which cannot be converted to and stored (in any meaningful way) as a an 8-bit integer.

Solution: Either make arr a generic Array whose elements can be arrays or - probably the more advanced but usually more performant solution - store your multidimensional array as a single flat array of size numrows * numcols and access an element via arr[column + row * numcols]:

var numrows = 5, numcols = 4;
var arr = new Int8Array(numrows * numcols).fill(0);

arr[3 + 1 * numrows] = 1; // col = 3, row = 1

console.log (arr);
le_m
  • 19,302
  • 9
  • 64
  • 74
  • Can I interpret this **read** operation multiply numcols with row (i.e `arr[column + row * numcols]`) while **write** operation multiply numrows with row (i.e `arr[column + row * numrows]`)? This seems wrong to me since read/write formula are inconsistent. – DrSensor Sep 23 '21 at 05:06