в образовательных целях я пытаюсь написать свою собственную библиотеку линейной алгебры (возможно, сравнимую с Eigen), и я ищу хороший способ хранения чисел. Я читал, что Eigen хранит их в массиве, который создается в куче, а затем ссылается на класс хранения. Когда я пытался взглянуть на производительность, создание указанного массива (размером 10000000 элементов) было довольно быстрым, сопоставимым с производительностью Eigen, когда я использовал double, float или int в качестве типов данных. Когда я использую сложные или другие типы, инициализация массива такого размера занимает целую вечность, в то время как у Eigen практически нет накладных расходов.
Поэтому: я хотел бы попытаться сохранить реальную часть и мнимую часть отдельно. Но когда я создаю класс, который выполняет сохранение чисел для меня, я хотел бы перегружать оператор скобки для доступа к элементам. С
template<typename nt>
std::complex<nt> operator[](int a){
return std::complex<nt>(realpart[a],imagpart[a]);
}
я мог бы вернуть комплексное число, но не могу использовать a[4]=std::complex<nt>(1,3)
в качестве присваивания элемента. Когда я сохраняю свои элементы в сложном массиве, я могу использовать ссылку для выполнения назначения, например:
template<typename nt>
&std::complex<nt> operator[](int a){
return numbers[a];
}
Есть ли способ вернуть комплексное число с помощью скобки, но заставить назначение работать? Как Эйген справляется с этим? И почему создание сложного массива имеет столько издержек по сравнению с обычными числами?
Спасибо за помощь!