| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Проблемы с перегрузкой операторов. |
| Автор: Elfet 19.4.2010, 13:03 | ||||||||
| Всем привет! Столкнулся с непонятной мне проблемой при перегрузке операторов. Пожалуйста, помогите разобраться! Вот у меня есть класс матрицы:
В нём я переопределил операции:
Однако вот такое вот выражение не хочет компилироваться :
Говорит:
Что делать? Заранее спасибо! |
| Автор: W4FhLF 19.4.2010, 13:09 | ||
|
| Автор: Elfet 19.4.2010, 13:20 | ||
W4FhLF,
|
| Автор: W4FhLF 19.4.2010, 13:28 | ||
Ну так определи оператор.
|
| Автор: azesmcar 19.4.2010, 13:29 |
| Elfet Переделай операторы, пусть принимают не ссылку на Matrix а константную ссылку, в результате m * 2 получается temporary object (поскольку оператор * возвращает объект по значению), который не передается в виде ссылки. Да...и почему функции size1(), size2() не константны? |
| Автор: W4FhLF 19.4.2010, 13:29 | ||
лучше так:
|
| Автор: azesmcar 19.4.2010, 13:33 |
| W4FhLF Так ведь есть же такой оператор. |
| Автор: toxx 19.4.2010, 13:34 | ||||
Попробуй так |
| Автор: Elfet 19.4.2010, 13:42 | ||
| Ок, всем спасибо! Вот что получилось:
Где бы мне почитать чего-нибудь про все эти константные ссылки и прочие константы? |
| Автор: Elfet 19.4.2010, 13:54 |
| протестировал мой класс в сравнении с uBLAS: Матрицы размером 4х4, 1000000 итераций вот что получилось: операция: n = m + m; CPU time for uBLAS = 1.357 CPU time for Matrix = 0.889 операция: n = 2 * m - m; CPU time for uBLAS = 1.607 CPU time for Matrix = 1.404 операция: n = 2 * m + m / 3.3 - 0.1 * -m; CPU time for uBLAS = 2.854 CPU time for Matrix = 3.682 Очёнь странно, получается. Мне нужно сделать так что бы мой класс обгонял uBLAS. Добавлено через 12 минут и 55 секунд операция: n = 2*m; n = m - n; CPU time for uBLAS = 2.761 CPU time for Matrix = 1.778 |
| Автор: W4FhLF 19.4.2010, 15:12 | ||||
Ну так у тебя обгоняет везде, кроме:
А это скорее всего из-за временных копий объектов, которые образуются на промежуточных этапах вычисления. У тебя дефайн:
Есть? |
| Автор: Elfet 19.4.2010, 15:24 | ||
ага, есть. И у буста тоже стоит:
Добавлено через 1 минуту и 23 секунды Порылся в uBLAS-е, у них там есть какие-то классы matrix_expression<AE> - возможно как-то хитро через них сделано. Понять бы как |
| Автор: W4FhLF 19.4.2010, 15:36 | ||
| В uBLAS'е хорошо оптимизированы типовые выражения типа xGEMM. Возможно они как раз этими классами представлены. Но вот интересно, если твою формулу переписать двойным циклом типа:
сколько будет по времени? |
| Автор: Elfet 19.4.2010, 21:55 | ||||||
Гораздо быстрее:
Интересно, можно ли как-нибудь ускорить мой класс? Добавлено через 13 минут и 11 секунд Вот что я могу придумать
Пример использования:
|
| Автор: Elfet 19.4.2010, 22:43 | ||
|