При чём тут скобки? Алгоритм должен быть красив. Если нельзя сделать красиво, то хотя бы единообразно (а не как в том же CL nth и elt получают одинаковые аргумента, но в разном порядке). И если существует эффективный алгоритм, то его должно быть можно использовать (а не как умножение матриц в C++).
...и почти наверняка неэффективен. Но ведь лисперам насрать на это, да. Главное чтоб анафорические лямбды, пандорические захваты и квазицитирования на несколько строк.
А «анафорические лямбды, пандорические захваты и квазицитирования на несколько строк» почти всегда выполняются на этапе компиляции и на скорость работы программы не влияют. Также как и шаблоны Александреку для C++ — красиво и эффективно.
Значит у тебя в городе нет служб доставки? У нас (небольшой городок на Украине ~ 0.5 млн жителей) каждый второй ресторанчик эту услугу предоставляет, впрочем, если нужно понтонуть можно просто позвонить в такси и они привезут. Поверь, большая з\п покроет и эту проблему (впадлу куда то ходить обедать).
Значит у тебя в городе нет служб доставки? У нас (небольшой городок на Украине ~ 0.5 млн жителей) каждый второй ресторанчик эту услугу предоставляет, впрочем, если нужно понтонуть можно просто позвонить в такси и они привезут. Поверь, большая з\п покроет и эту проблему (впадлу куда то ходить обедать).
Это ж самому надо напрягаться, незнакомым людям куда-то звонить, с доставщиками жрачки контактировать. Для асоциальных программистов жрачка от фирмы однозначно рулит :)
за доставку слупят полсотни, я хоть с миллионными доходами не готов только платить, обдиралово чистой воды. доставка выгодна, разве что если заказывают несколько человек. ну и плюс время, за которое ресторанчик соизволит все приготовить. не хорошо каждый раз рыпаться на предмет обеда.
при создании дополнительной матрицы необязательно копировать содержимое, можно copy-on-write механизм задействовать
Не понял. В C++ произведение трёх матриц будет вычисляться как
(T = A * B, T * C). При этом под T будет выделяться память через new (и тут же освобождаться по окончании вычислений). Или ты про то, что если сделать не operator+(const matrix &, const matrix &), а operator+(matrix, matrix) то ещё и пачку копирований получим? Так это уже можно считать ошибкой программиста, а не алгоритма.
В красивой реализации умножения матриц надо делать что-то типа mult(A, B, C) и сразу вычислять размерность результата.
В идеале, реализация должна уметь перемножать любой число параметров.
Подробнее, пожалуйста. Где ты видишь лишний цикл? Предложи более эффективный подход. Что мешает тебе его реализовать в C++?
Кроме того, в C++ нет матриц и их умножения, следовательно никто тебя не заставляет использовать неэффективные реализации — используй эффективные реализации.
Как я и предпологал ты ошибся при расчете эффективности.
Пусть A — n×m матрица, B — m×k матрица, C — k×t матрица.
Если считать T=A*B,T*C, то количество слогаемых составит n*m*k+n*k*t=n*k*(m+t). Если же считать mult(A, B, C) без создания промежуточной матрицы, то 1) число слогаемых составит n*m*k*t, что при m>1 и t>1 неменьше n*k*(m+t); 2) каждое слогаемое содержит на один множитель больше.
Выше изложенное позволяет усомниться в эффективности подсчета A*B*C без создания промежуточной матрицы. Хотя допускаю, что тебе известен более эффективные алгоритмы умножения матриц, чем те которые я предполагал.
Опять же не понимаю, что тебе мешает в C++ реализовать оператор умножения матриц, который вместо фактического умножения матриц создает и возвращает объект некоторого типа содержащий ссылки на перемножаемые матрицы и реализующий оператор неявного преобразования в матрицу.
число слагаемых составит n*m*k*t, что при m>1 и t>1 неменьше n*k*(m+t);
Упс... считал для (1, 3) * (3, 3) * (3, 1)... на практике встретилось, тогда просто написал mult(a,b,c) — стало быстрей.
Правда, для общего случая, всё равно лучше видеть все матрицы одновременно (их размерность), так как вычислительная сложность очень сильно зависит от порядка вычислений. При прямом вычислении n*m*(k+t), при обратном (сначала BC) — m*t(k+n). Если n > k, то выгодней считать сначала BC.
что тебе мешает в C++ реализовать оператор умножения матриц, который вместо фактического умножения матриц
ага . я про то ,что много документации обладает свойством быть Книгой из Анафема . т.е глубокое понимание модели реализации может и многим наносит необратимые последствия мировозрению.