Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.10.2023, 18:53
Интересующийся
Отправить личное сообщение для firep91613 Посмотреть профиль Найти все сообщения от firep91613
 
Регистрация: 24.10.2023
Сообщений: 25

3-х мерная матрица
Подскажите, правильно ли я делаю?
const matrix3D = [];

for (let i = 0; i < 2; i++) {
	let z = [];
  
  for (let j = 0; j < 2; j++) {
  	let y = [];
    
    for (let k = 0; k < 2; k++) {
    	y[k] = 0;
    }
    
    z.push(y);
  }
  
  matrix3D.push(z);
}

console.log(JSON.stringify(matrix3D))
Ответить с цитированием
  #2 (permalink)  
Старый 27.10.2023, 20:25
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,017

Можно так

function create3dMatrix(size) {
  return Array.from(Array(size), () => {
    return Array.from(Array(size), () => {
      return Array(size).fill(0);
    });
  });
}

console.log(JSON.stringify(create3dMatrix(2)));


Со стрелочными:

const create3dMatrix = size =>
  Array.from(Array(size), () =>
    Array.from(Array(size), () =>
      Array(size).fill(0)
    )
  )

Последний раз редактировалось ruslan_mart, 27.10.2023 в 20:28.
Ответить с цитированием
  #3 (permalink)  
Старый 27.10.2023, 20:54
Интересующийся
Отправить личное сообщение для firep91613 Посмотреть профиль Найти все сообщения от firep91613
 
Регистрация: 24.10.2023
Сообщений: 25

ruslan_mart,
благодарю за ответ.

function prettyPrint(data) {
  console.log(JSON.stringify(data));
}

class Matrix3D {
  constructor(len) {
    this.x = len.x;
    this.y = len.y;
    this.z = len.z;
    this.buffer = [];
  }

  init() {
    const matrix3D = [];

    for (let i = 0; i < this.z; i++) {
      let z = [];

      for (let j = 0; j < this.y; j++) {
        let y = [];

        for (let k = 0; k < this.x; k++) {
          y[k] = (j * this.x + k + 1) + (((this.x * this.y * this.z) / this.z) * i);
        }

        z.push(y);
      }

      matrix3D.push(z);
    }

    this.buffer = matrix3D;

    prettyPrint(matrix3D);
  }

  set(coords, value) {
    this.buffer[coords.z][coords.y][coords.x] = value;
  }
  
  get(coords) {
    return this.buffer[coords.z][coords.y][coords.x];
  }
}

const matrix = new Matrix3D({x: 2, y: 2, z: 2});
matrix.init();
matrix.set({x: 1, y: 1, z: 1}, 10);

prettyPrint(matrix.get({x: 1, y: 1, z: 1}));
prettyPrint(matrix.buffer);


Как можно сделать лучше нумерацию? Сейчас у меня так:
y[k] = (j * this.x + k + 1) + (((this.x * this.y * this.z) / this.z) * i);

Выглядит как-то громозко...

И как можно сделать без метода init? Ну т.е. new Matrix3D и все. Сразу buffer заполнить.
Ответить с цитированием
  #4 (permalink)  
Старый 27.10.2023, 21:22
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,017

Наверное как-то так

function prettyPrint(data) {
  console.log(JSON.stringify(data));
}

class Matrix3D {
  constructor(len) {
    this.x = len.x;
    this.y = len.y;
    this.z = len.z;
    this.init();
  }
  
  init() {
    const { x, y, z } = this;
    
    this.buffer = Array.from(Array(z), (_, i) => {
      return Array.from(Array(y), (_, j) => {
        return Array.from(Array(x), (_, k) => {
          return (j * x + k + 1) + (((x * y * z) / z) * i);
        });
      });
    });
  }
  
  set(coords, value) {
    this.buffer[coords.z][coords.y][coords.x] = value;
  }
  
  get(coords) {
    return this.buffer[coords.z][coords.y][coords.x];
  }
}

const matrix = new Matrix3D({x: 2, y: 2, z: 2});
matrix.init();
matrix.set({x: 1, y: 1, z: 1}, 10);

prettyPrint(matrix.get({x: 1, y: 1, z: 1}));
prettyPrint(matrix.buffer);
Ответить с цитированием
  #5 (permalink)  
Старый 27.10.2023, 21:33
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,017

Я бы вообще отказался от класса в пользу функции:

function prettyPrint(data) {
  console.log(JSON.stringify(data));
}

function createMatrix3D(initObject) {
  const { x, y, z } = initObject;

  const buffer = Array.from(Array(z), (_, i) =>
    Array.from(Array(y), (_, j) =>
      Array.from(Array(x), (_, k) => j * x + k + 1 + ((x * y * z) / z) * i)
    )
  );

  return {
    buffer,

    get: (coords) => buffer[coords.z][coords.y][coords.x],

    set: (coords, value) => {
      buffer[coords.z][coords.y][coords.x] = value;
    },
  };
}

const matrix = createMatrix3D({ x: 2, y: 2, z: 2 });

prettyPrint(matrix.get({ x: 1, y: 1, z: 1 }));
prettyPrint(matrix.buffer);


Думаю нет смысл в классе ради двух методов
Ответить с цитированием
  #6 (permalink)  
Старый 27.10.2023, 21:39
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,682

А это ((x * y * z) / z) не равно x*y ?
Ответить с цитированием
  #7 (permalink)  
Старый 27.10.2023, 21:42
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,682

Сообщение от ruslan_mart
Я бы вообще отказался от класса в пользу функции:
И для каждой матрицы (будь их хоть 100500) будут свои функции get и set. Вместо одной в прототипе.
Ответить с цитированием
  #8 (permalink)  
Старый 27.10.2023, 21:45
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,472

ruslan_mart, а какой смысл через функцию делать в объектном стиле то же самое, что и через класс, но при этом менее оптимально? (методы класса хранятся в памяти один раз и переиспользуются, у твоего же возвращаемого объекта они каждый раз уникальны и кушают на себя память)
__________________
29375, 35
Ответить с цитированием
  #9 (permalink)  
Старый 27.10.2023, 21:54
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,017

Смотря какое подразумевается использование, автор нигде не писал про 100500 вызовов)

Просто классом как-то более громоздко выглядит, ИМХО

В современном фронте разве кто-то парится насчет создания лишних функций в памяти? Это все спички. Движок внутри все это умеет оптимизировать.

На реакте вроде как тоже все ушли с классов в пользу функциональных компонентов, которые кучу анонимок плодят на каждый рендер)

P.S.: Array.from вторым параметром тоже анонимку плодит, так-то, еще и в 3 степени.

Последний раз редактировалось ruslan_mart, 27.10.2023 в 21:57.
Ответить с цитированием
  #10 (permalink)  
Старый 27.10.2023, 22:00
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,017

Aetae, смысла большого нет, вкусовщина по большей части. Думаю автор сам решит для себя, какой подход ему больше подходит
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Квадратная матрица, максимальные значения по параллельным побочной диагонали Retro_1477 Общие вопросы Javascript 4 05.11.2019 18:34
Матрица javascript Artem19981 Общие вопросы Javascript 2 19.01.2018 15:27
Матрица расстояний lihtaryk Общие вопросы Javascript 21 25.05.2015 15:55
9-ти разрядная матрица Mersedes! Ваши сайты и скрипты 4 09.08.2012 14:17
Матрица радиокнопок fredrsf Общие вопросы Javascript 13 10.11.2010 22:21