2013-05-27 4 views
0

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

Я нашел this, но это не сработало для меня.

Все, что я хочу, это доступ к матрицам разного размера с помощью метода доступа к массиву, то есть vMatrix [i].

Edit:

Прототип базового класса:

template<typename T, unsigned _Rows, unsigned _Cols> Eigen::Matrix; 

То, что я пытаюсь сделать:

vector<DerivedMatrix> vMatrix; 
vMatrix.push_back(some_5x4_matrix); 
vMatrix.push_back(some_4x10_matrix); 
vMatrix.push_back(some_10x1_matrix); 

матрицы размеры не определены, прежде чем руки.

Поскольку я знаю, что C больше, чем C++, я думаю о способе решить эту проблему: используя struct с void * и некоторый механизм для хранения типа элементов или строки & col; но я с тех пор, как изучаю C++, я бы хотел этого избежать.

+0

У объектов, которые вы хотите сохранить в своем массиве, есть общий базовый класс? Если да, то вы можете использовать полиморфизм. –

+0

Я не уверен, что Eigen поддерживает нечисловые типы. –

+0

Для этого вы можете использовать 'boost :: variant' или' boost :: any'. Если вы не можете использовать boost, см. [This] (http://stackoverflow.com/a/16770536/845568) ответ на пример реализации базового варианта. –

ответ

0

Если у вас есть предопределенный конечный набор типов, которые вы хотите поддержать, вы можете использовать Boost Variant.

Вы также можете использовать Boost Any как тип элемента массива/вектора.

+0

Набор типов практически бесконечен. –

+0

Затем попробуйте boost :: any. –

+0

Я стараюсь избегать использования большей поддержки, так как я пытаюсь изучить продвинутый C++. Любая идея, как они это реализуют? –

0

Как насчет следующего фрагмента? Что касается динамических размеров, вы можете изменить размер матриц в любой точке с помощью функции .resize(). Помогает ли это?

#include<iostream> 
#include<vector> 
#include <Eigen/Dense> 
using namespace Eigen; 
using namespace std; 

int main(int argc,char **argv){ 
    vector<MatrixXf> A; 
    MatrixXf P = MatrixXf::Random(2,3); 
    MatrixXf Q = MatrixXf::Random(4,5); 
    MatrixXf R = MatrixXf::Random(3,4); 
    A.push_back(P); 
    A.push_back(Q); 
    A.push_back(R); 
    cout<<A[0]<<endl<<A[1]<<endl<<A[2]<<endl; 
    return 0; 
} 
+0

Это временное решение. Я искал решение для компиляции. Я видел свет с вариативными шаблонами, но пока не мог вникать в это. Я могу опубликовать его здесь, когда я закончу, если вы захотите. –

+0

Да, пожалуйста. Знание - это блюдо, которое лучше всего обслуживается горячим. –

Смежные вопросы