Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
0. что за магик-намберы? матриц, отличных от 5х5 не бывает что-ли?
1. размеры A, Temp полагаю лучше инициализировать сразу.
2. необходимость создания матрицы меньшего размера вопрос спорный - ну и черт с ней.
3. pow(-1,static_cast<double>(i + j + 2)) - а подумать?
4. строка 38. 1/determinant() внутри цикла. офигенно.
5. в дополнение - тогда и Temp не понадобится.
Пошло бы ты в жопу, мудило. Что я сказал не так? твоя последняя функция в конечном счёте будет возвращать не константу? Или ты имеешь в виду, что этой константой может быть результат вычислений?
>Что я сказал не так?
Всего лишь не верное утверждение. Признак чистоты функции не в константности возвращаемого значения, если посмотреть на функцию постом выше.
Эта функция не чиста, поскольку у неё отсутствует свойство детерминированности. Ты не можешь сказать, какое именно число она возвращает, и не можешь заменить её вызовы константой в исходном коде.
Тогда мне вообще непонятны твои наезды. Я же не сказал, что функция без аргументов чиста ТОГДА И ТОЛЬКО ТОГДА, когда она возвращает константу. Это необходимое, но не достаточное условие.
>Я же не сказал, что функция без аргументов чиста ТОГДА И ТОЛЬКО ТОГДА, когда она возвращает константу. Это необходимое, но не достаточное условие.
>Это необходимое, но не достаточное условие.
>Это необходимое
Оно не необходимое. И оно не достаточное.
Функция может быть как чистой, так и не чистой, но при это возвращает константу:
const int DirtyFffuuu(void)
Константа - понятие относительное, как видишь из этого примера. Слову "константа" места в определении чистой функции нет. Ты не знаешь определение чистой функции, по всему видно.
Специально для особо одарённых: под константой в данном контексте (функция без параметров, возвращающая число) я понимал некоторое число, которое известно или может быть вычислено на этапе компиляции (не в контексте конкретно c++, чистые функции никак не завязаны на c++). К примеру, она может быть суперпозицией чистых функций с фиксированными аргументами.
> Оно не необходимое
ты, похоже, не в ладах с математикой, говно.
Раз эта функция может быть как чистой, так и грязной, и не возвращает константу. => Это не необходимое правило для чистых функций.
Ты только в своем последнем посте наконец понял, что константа - это свойство, в данном случае, возвращенной переменной, а не функции. Именно поэтому слово константа не может участвовать в определении чистой функции.
>в данном контексте (функция без параметров, возвращающая число)
>возвращающая число
Ну если у тебя функция ещё и только числа возвращает, но не может другие типы, то почему ты мне это подсовывал как определение чистой функции без параметров?
>Раз функция может быть как чистой, так и грязной, и не возвращает константу. => Это не необходимое правило для чистых функций.
Ну ты и еблан... Это как раз означает, что условие не является достаточным.
> что константа - это свойство, в данном случае, возвращенной переменной, а не функции
Ты сам то понял, что сморозил?
> Ну если у тебя функция ещё и только числа возвращает
Да, блядь, determinant() возвращает число, ты не знал?
> подсовывал как определение
Где ты увидел определение?
> только числа возвращает
Чистая функция без параметров может с тем же успехом возвращать списки фиксированной структуры, ну ты понял > ну ты понял
кого я обманываю....
>Ну ты и еблан...
А казался уравновешенным и серьёзным человеком. Я был о тебе более высокого мнения. Ты меня разочаровал.
>Это как раз означает, что условие не является достаточным.
Или ты не уловил суть или ничего не смыслишь в "необходимом и достаточном условии".
Пусть CR - утверждение, что мы возвращаем константу. Пусть CF - утверждение, что функция чистая.
Ты сказал:
>функция без аргументов чиста ТОГДА, когда она возвращает константу. Это необходимое, но не достаточное условие.
Необходимое условие означает:
!CR -> !CF.
Опровергаю твоё утверждение !CR -> !CF.:
int DirtyFffuuu(void) - константу не возвращает, то есть !CR, но при этом она чистая: CF. То есть !CR !-> CF. Но по твоему утверждению !CR -> !CF. Как видишь противоречие на лицо, ну если ты хоть немного знаешь математику.
>Ты сам то понял, что сморозил?
Ну а ты не понял. Я это понял. Ну ты понел.
>Где ты увидел определение?
Согласен, не определение, но это достаточное условие.
>Чистая функция без параметров может с тем же успехом возвращать списки фиксированной структуры, ну ты понял
КО? И константную структуру, да. И что? Ты хотел поразить меня своими императивными знаниями?
> казался уравновешенным и серьёзным человеком
я такой и есть, ты просто доставляешь мне лулзы
> int DirtyFffuuu(void) - константу не возвращает, то есть !CR, но при этом она чистая
> Dirty
> она чистая
По-моему, ты обосрался, и всячески стараешься это скрыть за умными словами.
> Dirty
> она чистая
Согласен. Не верно назвал. Хорошо переименую:
int CleanFffuuu(void) - константу не возвращает, то есть !CR, но при этом она чистая: CF.
Так стало понятнее? Не важно как функция названа. Главное - какая она на самом деле. Если ты после переименования все ещё не выезжаешь простую логику, то могу повторить простое "математическое" доказательство ещё раз.
2 lucidfoxGovno
Неважно кто тебя посылает нахуй. Главное - что ты пидарасина считаешь разведение унылой дисскусии ни о чем "успешным троллингом", а в реале я вижу тебя как терпеливого хуесоса, несущего ахинею и рефрешащего говнокод в ожидании что кто-нибудь да ответит на твой бред...
Признак чистоты функции: возвращаемое значение зависит ТОЛЬКО от переданных аргументов. Если функция чиста и не принимает аргументов, она ДОЛЖНА возвращать всегда ОДНО И ТОЖЕ значение, т.е. константу. Все её вызовы должно быть можно удалить и заменить той самой константой.
сосни хуйца, неуч
Короче, ты примерно уловил мыслю.
В функциях, не меняющих состояние класса (то есть с атрибутом const&) можно заменять на константы обращения к функциям с тем же атрибутом, если вся грязь этих функцию лежит в обращениях к классу (т.е. функции локально чисты).
Да, я понял, что вы имеете в виду. Не имею ничего против, только вряд ли компилятор будет делать такую оптимизацию, поскольку насрать в матрицу между вызовами determinant может кто угодно. Разумней явно объявить локальную константу и инициализировать её значением, возвращаемым функцией determinant.
По идее, можно сделать компилятор, который видит, что если написано
A := B.ChangeCell(i, j, NewValue)
и дальше B нигде не используется, и внутри метода ChangeCell первой же строкой написано Result:=*This, то можно сразу писать B на место A.
Но опять же, в многопоточной программе эта оптимизация нарушит логику, то есть надо думать, как бы эту оптимизацию подружить с потоками.
>только вряд ли компилятор будет делать такую оптимизацию
Ты всеж погугли expression elimination и пойми, когда применима эта оптимизация, а когда нет. Нечего голословно что-то утверждать.
ССЗБ
Это из серии, что оптимизация лишнего вызова конструктора-деструктора может изменить логику программы.
Так вот, если из-за этого меняется логика, то пейсатель конструктора ошибся.
Ты не знаешь физику, поэтому не понимаешь, что такое система отсчета. Вот, в зависимости от того, какую систему отсчета принять - функция будет чистой, а может и нет. В рамках системы отсчета этих 2х циклов она чистая. В более широких рамках - грязная, тк имеет сайдэффекты, в отличии от другого способа выбора системы отсчета.
Материальная точка либо движется, либо нет. Третьего не дано.
Но всегда можно взять другую систему отсчета, где движущаяся точка стоит.
"Все проблемы от незнания мат части." (c)
Если ты такое умное гавно, что приводишь совершенно не относящиеся к делу аналогии и делаешь непонятные предположения, приведи мне пример, когда следующая функция не будет чистой:
int sum(int a, int b) { return a + b; }
Будет предполагать, что железо и операционная система не дают сбоев.
Оба на! Но ведь всегда можно выбрать систему отчёта, в которой покоящаяся в другой системе отчёта материальная точка движется. Так что твои предположения и аналогии не более чем бред и унылое гавно.
Нет. Аналогия верна только для грязных функций. Чистая функция по определению не может стать грязной. А грязная может быть чистой в некоторых системах отсчета. В частности, она чиста в данном примере в течении обоих вложенных циклов. У неё нет сайд эффектов в течении этих 2х циклов и в них её можно заменить "константой".
делай что должен и будь что будет
не надо полагаться на то, что компилятор умнее тебя, будет что то там кешировать и ты со всем этим охуенно взлетишь
написал ему "тут должна вызываться функция", рассчитывай, что тупой компилятор тут вызовет функцию
а то привыкли, понимаешь
Ты не знаешь физику, поэтому не понимаешь, что такое система отсчета. Вот, в зависимости от того, какую систему отсчета принять - функция будет чистой, а может и нет. В рамках системы отсчета этих 2х циклов она чистая. В более широких рамках - грязная, тк имеет сайдэффекты, в отличии от другого способа выбора системы отсчета.
Расскажи нам лучше ПОЛИМОРФИЗМ В ФИЗИКЕ!
>Материальная точка либо движется, либо нет. Третьего не дано.
>Но всегда можно взять другую систему отсчета, где движущаяся точка стоит.
Как бы ты с помощью портала выебал себя в жопу? Или не стоит?
А теперь положим, что кто-то пустил второй поток, который модифицирует матрицу, для которой идёт процесс вычисления обратной матрицы. Ну и где твоя "чистота" сейчас?
В данном случае это ошибка реализации алгоритма. Это совсем другой случай. Я его не обсуждал, тк считал, что в данном коде нет таких серьёзных ошибок реализации алгоритма. В таком контексте она всегда грязная. Как только указатель этой конкретной функции передали в другую функцию или она вызывается из функции, указатель на которую передается в другую функцию - эта оптимизация не применима (так определяют крестовые компиляторы). Грязная функция, в таком контексте, всегда останется грязной, какую систему отсчета не брать.
А всё потому, что чистота функции - вещь безусловная. И сказать, чистая ли функция или нет, должно быть можно лишь по её определению, вне зависимости от контекста. И аналогия твоя - полное фуфло и к делу не относится.
Я был бы рад, если б этот тупой ебанько действительно смылся.
Но стопудово скоро он прожует то говно, которым его накормили и вернется.
Соскучится же за привычным вкусом во рту.
жалкая попытка, говнецо
ты столько раз фейлился в школьных задачах, что твое мнение о профессиональном программировании даже со спортивной точки зрения никому не интересно
я далёк от rtl. базовые контейнеры там уже есть? ввод-вывод с фасетами и локализацией? абстрактные алгоритмы? в стл не так уж и много всего.
по беглому обзору апи в rtl она скорее похожа на стандартную библиотеку старичка Си
и да, буст кому то может и сторонний, а для кого то такой же стандартный, потому что используется в 100% С++ проектов на работе
это плохой ответ на поставленные вопросы
есть ли во "вменяемой" библиотеке для дельфей то, что используется в работе каждый день - хотя бы контейнеры, обеспечивающие ожидаемую эффективность под конкретную задачу?
о многом не прошу
интересует контейнер со сложностью доступа к i элементу за O(1)
контейнер с сложностью вставки в начало, конец и середину за O(1)
контейнер с сложностью поиска элемента по своему ключу в контейнере за O(logN) или лучше и, при этом, сложностью вставки лучше O(N)
алгоритмы сортировки, поиска по этим контейнерам
единообразие работы с ними
наверное, почти за 6 лет ниразу не приходилось этим заниматься, а этот ГК конечно ну из очень серьезного проекта (:
я матан вообще стороной стараюсь обходить.
>наверное, почти за 6 лет ниразу не приходилось этим заниматься
Если тебе не приходилось, то это не значит, что другим не приходилось.
>98% программистов сталкиваются с этой задачей наверное только в студенческие годы
Это твоё утверждение полностью голословно. Или подтверди статистикой или не зачет.
namespace ublas = boost::numeric::ublas;
ublas::matrix<T> A(DIM, DIM);
// fill matrix A here ...
ublas::matrix<T> A_inv = ublas::identity_matrix<T>(A.size1());
ublas::permutation_matrix<> P(A.size1());
if (ublas::lu_factorize(A, P))
// матрица A вырожденная, поэтому, например
return 0;
ublas::lu_substitute(A, P, A_inv); // profit, результат в A_inv
быстродействие? потребление памяти? самостоятельно параллелится на доступные вычислительные ресурсы?
вот приведенный выше код, мать его, работает в 1 поток, поэтому сливает на больших матрицах реализациям в том же Maple, поэтому нужно искать другие варианты
в любом случае, С++ не самый удобный язык для математиков
> быстродействие? потребление памяти?
hmatrix реализована с помощью GSL, BLAS and LAPACK, так что полагаю, сравнимо.
> самостоятельно параллелится на доступные вычислительные ресурсы?
Удивился бы). А разве обратная матрица легко параллелится? (для такой задачи надо что-то вроде низкоуровнего mpi).
да, я когда трогал эту задачу сравнил производительность этого решения и мапла на больших матрицах, мапл умеет её решать параллельно, т.к. нагружал все ядра проца, а это решение - только одно
на маленьких матрицах мапл, конечно, сливал
проверял банальным образом - собрал из этого кода dll и подцпелял в мапле, смотрел мапловское время использования обоих способов на одинаковых матрицах
пришлось погуглить алгоритмы распараллеливания вычисления обратной матрицы, понял, что они существуют, но за пару вечеров я это не сотворю, на чем и остановился
а чего сложного прочитать
создаем матрицу для результата и сразу инициируем её единичной матрицей
подготавливаем матрицу перестановок соответствующего размера
двумя методами проводим LU-разложение и получаем обратную матрицу
никаких магических чисел и ограничений по размеру
1. Привет, bartimeus33nt10! -> Моя кабинка
2. Личные настройки
3. Уведомлять меня о новых комментариях к моему говнокоду := Нет, прекратите это немедленно!
4. ...
5. PROFIT!
1. размеры A, Temp полагаю лучше инициализировать сразу.
2. необходимость создания матрицы меньшего размера вопрос спорный - ну и черт с ней.
3. pow(-1,static_cast<double>(i + j + 2)) - а подумать?
4. строка 38. 1/determinant() внутри цикла. офигенно.
5. в дополнение - тогда и Temp не понадобится.
Правда, есть шанс, что вызов детерминанта компилятор закеширует.
с какой радости?
Всего лишь не верное утверждение. Признак чистоты функции не в константности возвращаемого значения, если посмотреть на функцию постом выше.
>DirtyFffuuu.
>Dirty
Надеюсь языки знаете.
>Это необходимое, но не достаточное условие.
>Это необходимое
Оно не необходимое. И оно не достаточное.
Функция может быть как чистой, так и не чистой, но при это возвращает константу: Константа - понятие относительное, как видишь из этого примера. Слову "константа" места в определении чистой функции нет. Ты не знаешь определение чистой функции, по всему видно.
> Оно не необходимое
ты, похоже, не в ладах с математикой, говно.
Пруф?
> Оно не необходимое
Раз эта функция может быть как чистой, так и грязной, и не возвращает константу. => Это не необходимое правило для чистых функций.
Ты только в своем последнем посте наконец понял, что константа - это свойство, в данном случае, возвращенной переменной, а не функции. Именно поэтому слово константа не может участвовать в определении чистой функции.
>в данном контексте (функция без параметров, возвращающая число)
>возвращающая число
Ну если у тебя функция ещё и только числа возвращает, но не может другие типы, то почему ты мне это подсовывал как определение чистой функции без параметров?
Ну ты и еблан... Это как раз означает, что условие не является достаточным.
> что константа - это свойство, в данном случае, возвращенной переменной, а не функции
Ты сам то понял, что сморозил?
> Ну если у тебя функция ещё и только числа возвращает
Да, блядь, determinant() возвращает число, ты не знал?
> подсовывал как определение
Где ты увидел определение?
> только числа возвращает
Чистая функция без параметров может с тем же успехом возвращать списки фиксированной структуры, ну ты понял
> ну ты понял
кого я обманываю....
А казался уравновешенным и серьёзным человеком. Я был о тебе более высокого мнения. Ты меня разочаровал.
>Это как раз означает, что условие не является достаточным.
Или ты не уловил суть или ничего не смыслишь в "необходимом и достаточном условии".
Пусть CR - утверждение, что мы возвращаем константу. Пусть CF - утверждение, что функция чистая.
Ты сказал:
>функция без аргументов чиста ТОГДА, когда она возвращает константу. Это необходимое, но не достаточное условие.
Необходимое условие означает:
!CR -> !CF.
Опровергаю твоё утверждение !CR -> !CF.:
int DirtyFffuuu(void) - константу не возвращает, то есть !CR, но при этом она чистая: CF. То есть !CR !-> CF. Но по твоему утверждению !CR -> !CF. Как видишь противоречие на лицо, ну если ты хоть немного знаешь математику.
>Ты сам то понял, что сморозил?
Ну а ты не понял. Я это понял. Ну ты понел.
>Где ты увидел определение?
Согласен, не определение, но это достаточное условие. А оно, как видишь. Не верно.
>Чистая функция без параметров может с тем же успехом возвращать списки фиксированной структуры, ну ты понял
КО? И константную структуру, да. И что? Ты хотел поразить меня своими императивными знаниями?
я такой и есть, ты просто доставляешь мне лулзы
> int DirtyFffuuu(void) - константу не возвращает, то есть !CR, но при этом она чистая
> Dirty
> она чистая
По-моему, ты обосрался, и всячески стараешься это скрыть за умными словами.
> она чистая
Согласен. Не верно назвал. Хорошо переименую:
int CleanFffuuu(void) - константу не возвращает, то есть !CR, но при этом она чистая: CF.
Так стало понятнее? Не важно как функция названа. Главное - какая она на самом деле. Если ты после переименования все ещё не выезжаешь простую логику, то могу повторить простое "математическое" доказательство ещё раз.
Неважно кто тебя посылает нахуй. Главное - что ты пидарасина считаешь разведение унылой дисскусии ни о чем "успешным троллингом", а в реале я вижу тебя как терпеливого хуесоса, несущего ахинею и рефрешащего говнокод в ожидании что кто-нибудь да ответит на твой бред...
> Надеюсь языки знаете.
К твоему сведению, обезьяна, clean - это сортиры драить, для чистых функций используется слово PURE.
сосни хуйца, неуч
только детерминистская функция так себя ведет
В функциях, не меняющих состояние класса (то есть с атрибутом const&) можно заменять на константы обращения к функциям с тем же атрибутом, если вся грязь этих функцию лежит в обращениях к классу (т.е. функции локально чисты).
Не может, если сделать критическую секцию.
A := B.ChangeCell(i, j, NewValue)
и дальше B нигде не используется, и внутри метода ChangeCell первой же строкой написано Result:=*This, то можно сразу писать B на место A.
Но опять же, в многопоточной программе эта оптимизация нарушит логику, то есть надо думать, как бы эту оптимизацию подружить с потоками.
В печень ему!^W^W^W В данном алгоритме все равно матрицу меняем, можно сразу копировать и в чужую область видимости не открываться.
Ты всеж погугли expression elimination и пойми, когда применима эта оптимизация, а когда нет. Нечего голословно что-то утверждать.
Ну если не умеешь программировать, то да.
ССЗБ
Это из серии, что оптимизация лишнего вызова конструктора-деструктора может изменить логику программы.
Так вот, если из-за этого меняется логика, то пейсатель конструктора ошибся.
"Все проблемы от незнания мат части." (c)
Материальная точка либо движется, либо нет. Третьего не дано.
Но всегда можно взять другую систему отсчета, где движущаяся точка стоит.
"Все проблемы от незнания мат части." (c)
Может с твоим мозгом - да.
>когда следующая функция не будет чистой?
Она чиста всегда.
не надо полагаться на то, что компилятор умнее тебя, будет что то там кешировать и ты со всем этим охуенно взлетишь
написал ему "тут должна вызываться функция", рассчитывай, что тупой компилятор тут вызовет функцию
а то привыкли, понимаешь
Расскажи нам лучше ПОЛИМОРФИЗМ В ФИЗИКЕ!
>Материальная точка либо движется, либо нет. Третьего не дано.
>Но всегда можно взять другую систему отсчета, где движущаяся точка стоит.
Как бы ты с помощью портала выебал себя в жопу? Или не стоит?
Вот это: чистая функция?
Но стопудово скоро он прожует то говно, которым его накормили и вернется.
Соскучится же за привычным вкусом во рту.
правда, однопоточное
поэтому зла не держу
ты столько раз фейлился в школьных задачах, что твое мнение о профессиональном программировании даже со спортивной точки зрения никому не интересно
http://govnokod.ru/8426#comment117910
час дня, почему не в школе? природоведение закончилось раньше?
по беглому обзору апи в rtl она скорее похожа на стандартную библиотеку старичка Си
и да, буст кому то может и сторонний, а для кого то такой же стандартный, потому что используется в 100% С++ проектов на работе
правдивость какого-либо утверждения обратно пропорциональна удаленности утверждающего от обьекта обсуждения
есть ли во "вменяемой" библиотеке для дельфей то, что используется в работе каждый день - хотя бы контейнеры, обеспечивающие ожидаемую эффективность под конкретную задачу?
интересует контейнер со сложностью доступа к i элементу за O(1)
контейнер с сложностью вставки в начало, конец и середину за O(1)
контейнер с сложностью поиска элемента по своему ключу в контейнере за O(logN) или лучше и, при этом, сложностью вставки лучше O(N)
алгоритмы сортировки, поиска по этим контейнерам
единообразие работы с ними
да есть такая проблема - в старых версиях дельфи приходилось делать самому:(
Ооооо. Да ты над проектами серьёзными не работал.
я матан вообще стороной стараюсь обходить.
Если тебе не приходилось, то это не значит, что другим не приходилось.
>98% программистов сталкиваются с этой задачей наверное только в студенческие годы
Это твоё утверждение полностью голословно. Или подтверди статистикой или не зачет.
2. с чего я какому-то гавну должен что-то доказывать?
Формочки клепаешь и странички верстаешь? Зачет.
import Numeric.LinearAlgebra -- hmatrix
inv $ (2><2) [1,2,0,1] -- выведет [1,-2,0,1]
вот приведенный выше код, мать его, работает в 1 поток, поэтому сливает на больших матрицах реализациям в том же Maple, поэтому нужно искать другие варианты
в любом случае, С++ не самый удобный язык для математиков
hmatrix реализована с помощью GSL, BLAS and LAPACK, так что полагаю, сравнимо.
> самостоятельно параллелится на доступные вычислительные ресурсы?
Удивился бы). А разве обратная матрица легко параллелится? (для такой задачи надо что-то вроде низкоуровнего mpi).
на маленьких матрицах мапл, конечно, сливал
проверял банальным образом - собрал из этого кода dll и подцпелял в мапле, смотрел мапловское время использования обоих способов на одинаковых матрицах
пришлось погуглить алгоритмы распараллеливания вычисления обратной матрицы, понял, что они существуют, но за пару вечеров я это не сотворю, на чем и остановился
это понятно, имелось ввиду, что это нетривиально
На это натыкались: http://www.mcs.anl.gov/research/projects/mpi/libraries.html? (scalapack).
Возможно, есть пакеты и в дистрибутивах gnu/linux.
создаем матрицу для результата и сразу инициируем её единичной матрицей
подготавливаем матрицу перестановок соответствующего размера
двумя методами проводим LU-разложение и получаем обратную матрицу
никаких магических чисел и ограничений по размеру
Почему?
2. Личные настройки
3. Уведомлять меня о новых комментариях к моему говнокоду := Нет, прекратите это немедленно!
4. ...
5. PROFIT!