Что делают инициализированные конструкторы массива?

#c #eigen

#c #eigen

Вопрос:

В Eigen документации я вижу много таких:

 Array (const Scalar amp;val0, const Scalar amp;val1)
Array (const Scalar amp;val0, const Scalar amp;val1, const Scalar amp;val2)
Array (const Scalar amp;val0, const Scalar amp;val1, const Scalar amp;val2, const Scalar amp;val3)
  

Согласно документации (http://eigen.tuxfamily.org/dox/classEigen_1_1Array.html ) эти конструкторы «создают инициализированный N общий вектор с заданными коэффициентами».

Что это значит? Если я сделаю Array (1,2,3), каков результат?

В частности, какие коэффициенты он помещает в каждое измерение и насколько велик массив в каждом из этих соответствующих измерений? Конструктор Array(1,2,3) , согласно документам, должен создать 3D-массив и инициализировать его содержимое «заданными коэффициентами». Как должен выглядеть результат?

Комментарии:

1. Это сторонняя библиотека, а не стандартная библиотека, поэтому не ожидайте здесь слишком большой помощи. Однако, основываясь на документации, я бы предположил, что он инициализирует массив этими значениями. Этот тип кода, вероятно, предшествует спискам инициализаторов, которые позволили бы это сделать с помощью одного конструктора.

2. Ммм… Что мешает вам записать это в коде и распечатать матрицу? Вы можете проверить вывод примерно в 10 строках кода.

3. ошибки компилятора @luk32.

4. Что ж, тогда теперь у вас нет проблем с тем, что на самом деле делает код. Может быть, попробуйте решить все по порядку.

5. @luk32 вы хотите, чтобы я попытался исправить ошибку компилятора, прежде чем я пойму, что должен делать код?

Ответ №1:

Конструкторы предназначены для массивов фиксированного размера. Предполагая, что объявление Eigen::Array3i тогда упомянутый вами конструктор инициализирует массив 1D int с тремя элементами, инициализированными указанными значениями.

Комментарии:

1. Но в документации конкретно указано, что это для 2D, 3D и т.д. массивов

2. @Jason Я думаю, что существует недопонимание в отношении 2D, 3D, 4D. Размеры — это не «физические» размеры, а скорее длина одного измерения массива. Eigen::Array Также может иметь два «физических» измерения, как матрица, но это не так в упомянутых конструкторах.

3. Я не думаю, что понимаю. Когда они говорят 4D вектор, они имеют в виду 1D вектор длиной 4?

4. Мой следующий вопрос должен был заключаться в том, почему они называют их векторами, когда векторы всегда 1D, но я думаю, что это ответ на него…

5. @Jason Я не первый, кто так говорит, но документация подобна сексу: когда это хорошо, это очень, очень хорошо; а когда это плохо, это лучше, чем ничего. При этом я не связан с собственным, я просто использую его. Я нахожу их документацию довольно хорошей и полезной.

Ответ №2:

Эти конструкторы позволяют создавать массивы размером до 4:

 Eigen::Array<int, 1, 4> a(1, 2, 3, 4)
  

Собственный файл выдаст ошибку компиляции, если вы попытаетесь инициализировать подобным образом что-либо, кроме N(1-4) x 1 массива. Например:

 Eigen::Array<int, 1, 3> a(1, 2, 3) //Fine
Eigen::Array<int, 3, 1> a(1, 2, 3) //Fine
Eigen::Array<int, 3, 3> a(1, 2, 3) //Compile error

error: ‘THIS_METHOD_IS_ONLY_FOR_VECTORS_OF_A_SPECIFIC_SIZE
  

Я бы не стал инициализировать их таким образом. Здесь есть руководство по собственной инициализации, в котором содержатся хорошие предложения о том, как инициализировать массивы, например:

 Eigen::Array33 a;
a << 1, 2, 3, 4 ...
  

У которого есть документация здесь.

Или вы можете использовать специальные инициализации, такие как:

 Eigen::ArrayXXf a = Eigen::ArrayXXf::Zero(1, 4) //0, 0, 0, 0
  

Комментарии:

1. Да, но что a(1,2,3,4) на самом деле делает? Каковы коэффициенты? Матрица 2x2x2x2 имеет 16 коэффициентов, но вы указали только 4…

2. Подождите, вы говорите, массив размером до 4. Не могли бы вы быть более конкретными, у вас может быть 3 размера для таких массивов / матриц. Что используется? Редактировать, хорошо, я вижу, что документы тоже довольно неясны. Я бы также не советовал этот метод инициализации, если это действительно не необходимо.

3. @Jason извините, я не был ясен, я отредактировал ответ, чтобы быть более ясным.

4. Бен, я думаю, это может быть другой конструктор, потому что то, что вы описываете, является одномерным вектором. В документах описывается построение 3D-вектора для Array(1,2,3)