nota bene.
Этот ответ имеет 20 голосов "за", но он не предназначен для одобрения std::valarray
.
По моему опыту, лучше потратить время на установку и обучение использованию полноценной математической библиотеки, такой как Eigen . У Valarray меньше возможностей, чем у конкурентов, но он не более эффективен и не особенно прост в использовании.
Если вам нужна только небольшая линейная алгебра, и вы абсолютно не можете добавить что-либо в свою цепочку инструментов, тогда, возможно, valarray
подойдет. Но быть застрявшим в неспособности выразить математически правильное решение вашей проблемы - это очень плохое положение. Математика неумолима и не прощает. Используйте правильный инструмент для работы.
Стандартная библиотека предоставляет std::valarray<double>
. std::vector<>
, предложенный несколькими другими здесь, предназначен как контейнер общего назначения для объектов. valarray
, менее известный, потому что он более специализированный (не использует «special» в качестве термина C ++), имеет несколько преимуществ:
- Не выделяет дополнительного места.
vector
округляет до ближайшей степени два при распределении, так что вы можете изменить его размер без перераспределения каждый раз. (Вы все еще можете изменить размер valarray
; это все равно так же дорого, как realloc()
.)
- Вы можете нарезать его, чтобы легко получить доступ к строкам и столбцам.
- Арифметические операторы работают так, как вы ожидаете.
Конечно, преимущество над C состоит в том, что вам не нужно управлять памятью. Размеры могут находиться в стеке или в объекте среза.
std::valarray<double> matrix( row * col ); // no more, no less, than a matrix
matrix[ std::slice( 2, col, row ) ] = pi; // set third column to pi
matrix[ std::slice( 3*row, row, 1 ) ] = e; // set fourth row to e