Хранить комплексные числа как вещественную и мнимую части отдельно - PullRequest
0 голосов
/ 29 января 2020

в образовательных целях я пытаюсь написать свою собственную библиотеку линейной алгебры (возможно, сравнимую с 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];
}

Есть ли способ вернуть комплексное число с помощью скобки, но заставить назначение работать? Как Эйген справляется с этим? И почему создание сложного массива имеет столько издержек по сравнению с обычными числами?

Спасибо за помощь!

...