2015-04-08 5 views
3

В Matlab синтаксис для добавления элементов в матрицеРеализовать Matlab Синтаксис в C++

A = [12 62 93 -8 22; 16 2 87 43 91; -4 17 -72 95 6] 
A = 
    12 62 93 -8 22 
    16  2 87 43 91 
    -4 17 -72 95  6 

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

Мне нужно знать, сколько строк содержит столбцы, чтобы сначала инициализировать матрицу.

Есть ли способ скопировать этот синтаксис в C++. Я хотел бы, чтобы пользователь мог создать матрицу с помощью удобного метода, а не создавать матрицу и проходить через каждый элемент, добавить значение.

Я могу обработать = с помощью перегрузки оператора, но что я делаю с правой стороны. Как я могу работать с [] или; , Мне не нужны двоеточия или скобки. Любой другой синтаксис будет работать, если это удобно для пользователя.

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

-Спасибо

+3

Эскиз: Если у вас все в порядке с матрицами с динамическим размером, вы можете использовать оператор запятой, перегруженный в значение кота/векторы/матрицы по столбцам, а оператор трубы перегружен до значения cat/векторов/матриц по строке и использует семантику перемещения для сокращения ваших копий. Имея это в виду, вам все равно понадобятся ваши собственные типы, иначе бы странные вещи произошли ... так что вам все равно придется следовать вышеизложенным ^. Или вы можете сделать то, что [Eigen] (http://eigen.tuxfamily.org/dox/classEigen_1_1DenseBase.html#ade5d2e09de50c2ca145037f295542b16) делает .... –

+0

@ RollenD'Souza спасибо. – nnrales

ответ

2

В ++ Язык программирования C (4-е издание), Глава 29, Stroutrup реализует Matrix класса, который удовлетворяет ваши требования. C++ 11 требуется.

В частности, это может быть инициализирован таким образом:

Matrix<int,2> m = {{1,2,3},{4,5,6}}; 

В частности, в §29.4.4, он определить Matrix_init, вложенную initializer_list, то есть то, что вы ищете. Matrix_init<T,N> просто имеет Matrix_init<T,N-1> в качестве своего типа элемента:

template<typename T, size_t N> 
struct Matrix_init { 
    using type = initializer_list<typename Matrix_init<T,N-1>::type>; 
}; 

// specialization for N = 1 
template<typename T> 
struct Matrix_init<T,1> { 
    using type = initializer_list<T>; 
}; 

Теперь вы можете написать:

Matrix_init<int, 2>::type m{ {1,2}, {3,4} }; 

или, с помощью шаблона псевдонима,

template<typenameT,size_t N> 
using Matrix_initializer = typename Matrix_init<T,N>::type; 

Matrix_initializer<int,2> m{ {1,2}, {3,4} }; 
+0

Благодарю вас за помощь. – nnrales

1

Я не уверен, я бы рекомендовать его, но одна очевидная возможность:

std::vector<std::vector<int>> A = { 
    { 12 62 93 -8 22 }, 
    { 16 2 87 43 91 }, 
    { -4 17 -72 95 6 } 
}; 

До тех пор, пока это чисто образовательное, и вам не все равно, что тратить некоторое пространство, а данные не смежны, все должно быть хорошо.

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