![]() |
|
Модераторы: bsa |
![]()
|
|
| Elfet |
|
||||||||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Всем привет!
Столкнулся с непонятной мне проблемой при перегрузке операторов. Пожалуйста, помогите разобраться! Вот у меня есть класс матрицы:
В нём я переопределил операции:
Однако вот такое вот выражение не хочет компилироваться :
Говорит:
Что делать? Заранее спасибо! |
||||||||
|
|||||||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 2 Всего: 121 |
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
W4FhLF,
|
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 2 Всего: 121 |
Ну так определи оператор.
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Elfet
Переделай операторы, пусть принимают не ссылку на Matrix а константную ссылку, в результате m * 2 получается temporary object (поскольку оператор * возвращает объект по значению), который не передается в виде ссылки. Да...и почему функции size1(), size2() не константны? |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 2 Всего: 121 |
лучше так:
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
W4FhLF
Так ведь есть же такой оператор. |
|||
|
||||
| toxx |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 653 Регистрация: 4.3.2009 Где: НН Репутация: 4 Всего: 13 |
Попробуй так Это сообщение отредактировал(а) toxx - 19.4.2010, 13:35 |
||||
|
|||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Ок, всем спасибо!
Вот что получилось:
Где бы мне почитать чего-нибудь про все эти константные ссылки и прочие константы? |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Статуструп, Майерс. Добавлено через 2 минуты и 46 секунд const int вовсе не обязателен, можно просто int, это ничего не меняет. тут тоже самое. а вообще если изменения не планируются то ставь константу |
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
протестировал мой класс в сравнении с 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 |
|
||||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 2 Всего: 121 |
Ну так у тебя обгоняет везде, кроме:
А это скорее всего из-за временных копий объектов, которые образуются на промежуточных этапах вычисления. У тебя дефайн:
Есть? -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
||||
|
|||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
ага, есть. И у буста тоже стоит:
Добавлено через 1 минуту и 23 секунды Порылся в uBLAS-е, у них там есть какие-то классы matrix_expression<AE> - возможно как-то хитро через них сделано. Понять бы как |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 2 Всего: 121 |
В uBLAS'е хорошо оптимизированы типовые выражения типа xGEMM. Возможно они как раз этими классами представлены.
Но вот интересно, если твою формулу переписать двойным циклом типа:
сколько будет по времени? -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| Elfet |
|
||||||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Гораздо быстрее:
Интересно, можно ли как-нибудь ускорить мой класс? Добавлено через 13 минут и 11 секунд Вот что я могу придумать
Пример использования:
|
||||||
|
|||||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |