|
|
  |
scilab vs python, что выбрать? |
|
|
|
Dec 26 2014, 13:47
|
Знающий
   
Группа: Участник
Сообщений: 527
Регистрация: 4-06-14
Из: Санкт-Петербург
Пользователь №: 81 866

|
Про питон ничего сказать не могу, но Scilab вполне пригоден для моделей малой и средней сложности. Он довольно шустрый и начиная с 5.4 обзовелся нормальной мордой, неплохая стандартная библиотека (полная поддержка матричных вычислений, фильтрация/свертка/Фурье, а остальное можно сделать самому, открыв книжку по ЦОС  ). Моделировал на нем алгоритмы приёмника/передатчика, считал интерполяторы/дециматоры, соединял все это добро с HDL симулятором, работать можно. Из явных минус в сравнении с матлаб: нет fixed-point функционала, нет симулинка, нет встроенных функций помехоустойчивого кодирования (ну это проблема для меня была, не мог я сделать на нем полной модели приёмника, а кому то может и не важно это совсем  )
Сообщение отредактировал serjj - Dec 26 2014, 13:48
|
|
|
|
|
Dec 27 2014, 10:07
|
Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 22-04-08
Из: г. Екатеринбург
Пользователь №: 36 992

|
ну маета с установкой питона!
поставил на ура питон 3.4 x64, после этого библиотеки matplotlib ipython и т.п. ни в какую не хотели вставать, и visaul studio express всех мастей поставил и SDK со всевозможными компиляторами (не пробовал только mingw и gcc, полагая, что под WIN 7x64 лучше использовать компилятор от MSVS), пробовал советы из инета - все безрезультатно. в итоге - установил пока pyzo2014a, правда не знаю насколько это универсальная штука коллеги, посоветуйте, пожалуйста (!) наиболее совместимую конфигурацию - версия питона, компилятор, так, чтобы созданное ПО работало в т.ч. и на других машинах - речь о WINx (чаще всего 7x64), планирую применять matplotlib, ipython, notebook...
|
|
|
|
|
Dec 29 2014, 07:03
|

Профессионал
    
Группа: Свой
Сообщений: 1 003
Регистрация: 20-01-05
Пользователь №: 2 072

|
Цитата(Xenia @ Dec 26 2014, 11:18)  А бывают ли такие обертки для C++? Чтобы Питон не учить на C++ остаться, но так хитро определить классы (и операторы внутри них) матриц и векторов, чтобы алгебраические операции над ними можно было проиpводить в записи, приближенной к математической? Т.е. обычными 4-мя арифметическими действиями. Приличных оберток не видел, но есть alglib от Сергея Бочканова, где есть попытки прикрутить операторы куда нужно. Поскольку там уже все в классах, то, наверное, можно попытаться расширить список операций под свои нужды.
|
|
|
|
|
Dec 29 2014, 09:30
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(halfdoom @ Dec 29 2014, 10:03)  Приличных оберток не видел, но есть alglib от Сергея Бочканова, где есть попытки прикрутить операторы куда нужно. Поскольку там уже все в классах, то, наверное, можно попытаться расширить список операций под свои нужды. Про Alglib давно знаю и даже коллекционирую ее версии на ftp, однако стиль использования этой библиотеки мне сильно не нравится. Т.е. меня-то интересуют именно варианты "прикручивания", а не библиотеки, которые выполняют работу. Тогда как Alglib сильно "недокручена", поскольку требует явного вызова функций. Умножение двух матриц, на мой взгляд, должно выглядеть (на C++) так: Код RealMatrix A(3,4), B(4,3), C(3,3); C = A * B; где: RealMatrix - класс с конструктором, аллокирующий для матрицы место в памяти и запоминающий обе ее размерности. А дальше идет сплошная алгебра, по записи мало отличающаяся от математической. В сущности все три операции (*,+,-) совершенно тривиальны - их самой написать проще, чем библиотеки подключать. А потому проблема состоит только в том, чтобы компилятор компилировал непосредственно алгебраическую запись типа C = A * B, превращая ее в вызовы функций неявно. А вот такого "счастья", которое предлагает мне Alglib, мне задарма не надо: Код ae_matrix A; ae_matrix B; ae_matrix C; ae_frame_make(_state, &_frame_block); ae_matrix_init(&A, 3, 4, DT_REAL, _state); ae_matrix_init(&B, 4, 3, DT_REAL, _state); ae_matrix_init(&C, 3, 3, DT_REAL, _state); matrixmatrixmultiply(&A, i1, i1+row1-1, j1, j1+col1-1, trans1, &B, i2, i2+row2-1, j2, j2+col2-1, trans2, scl1, &C, i3, i3+l-1, j3, j3+r-1, scl2, &x1, _state); Жуть! Даже не верится, что это C++. Впечатление такое, что авторы библиотеки этого языка не знают, если настолько последовательно игнорируют его возможности.
|
|
|
|
|
Dec 29 2014, 13:42
|
Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 22-04-08
Из: г. Екатеринбург
Пользователь №: 36 992

|
Цитата(Xenia @ Dec 29 2014, 14:30)  Умножение двух матриц, на мой взгляд, должно выглядеть (на C++) так: Код RealMatrix A(3,4), B(4,3), C(3,3); C = A * B; почему бы хотя бы не например Код mpy(A,B); ? взять питон - дак вообще судя по всему для массива и матрицы у него значок * разное значит - как бы не запутаться вовсе...
|
|
|
|
Guest_TSerg_*
|
Dec 29 2014, 18:28
|
Guests

|
Цитата(shf_05 @ Dec 25 2014, 12:51)  добрый день, коллеги. .. теперь матлаб для меня закрыт, встал вопрос использовать "бесплатное" ПО, Может заинтересует SMath? http://ru.smath.info/
|
|
|
|
|
Dec 29 2014, 18:53
|
Местный
  
Группа: Участник
Сообщений: 421
Регистрация: 2-01-08
Пользователь №: 33 778

|
Цитата(Xenia @ Dec 26 2014, 15:52)  Проблему здесь вижу только в том, что в математике алгебраические операции - тернарные, т.е. в операции участвуют три объекта: между двумя из них производится операция, а в третий помещается результат. Тогда как в C++ операторы бывают лишь унарными и бинарными, а тернарных не бывает.
Но в принципе исхитриться здесь можно, причем самым простым и очевидным вариантом является создание промежуточного объекта, не имеющего явного имени. А для операции транспонирования вместо запрещенного апострофа можно выбрать какой-то унарный оператор - тильду или восклицательный знак.
Кстати, я сама это уже делала, а спрашиваю лишь потому, что мне интересно, решал ли кто-то подобную задачу, а если решал, то как именно. Тогда как меня коробит тот поход, когда при малейшей трудности в реализации задачи программист с готовностью иммигрирует на другой язык только потому, что эта фича там уже есть в готовом виде. Те кто занимаются графикой (OpenGL/D3D), играми и близкими к этому задачами давно уже так делают. А сейчас с использованием новых стандартов наверно улучшили свои решения, сам я давно уже не слежу, что там происходит. Но у них обычно фиксированные размерности не выше 3, геометрия.
|
|
|
|
|
Dec 30 2014, 04:45
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(amaora @ Dec 29 2014, 21:16)  Интереснее было бы компилировать код в алгебраической записи (на matlab языке или ином) в оптимальный код на C. Так, чтобы использовались известные свойства матриц. Например разреженность может заметно сократить количество операций при умножении. Матрицы могут быть симметричными, диагональными, ортогональными и т.д. Все это можно использовать при генерации оптимального по быстродействию (или другому критерию) кода. Если матрица диагональная, то ее хранят в векторе  . А такие свойства, как симметрия и эрмитовость, обычно не позволяют ускорить операции сложения, вычитания и умножения, поскольку для этого требуется, чтобы ОБА операнда обладали таким свойством. Что же касается разряженных матриц, то это скорее не алгебраическая проблема, а ... "процессоростроительная", т.к. касается только того, способен ли FPU быстрее выполнять бинарные операции, если один из операндов нулевой. Причем, в электронной реализации (а так же на FPGA) такая проверка операндов на нулёвость не привела бы к замедлению арифметики с прочими числами, поскольку признак нулёвости регистра всегда можно сделать схемотехническим, экстренно отменяющим выполнение операции. Но если процессоростроители этого не предусмотрели, то проверять каждый операнд на нулёвость в программе будет не менее накладно по времени, чем честно умножать на нуль. Тем не менее, я веду речь исключительно об удобстве использования арифметических операторов в матрично-векторных выражениях и ни о чем другом, т.к. всё другое традиционно производится через явные вызовы функций, а не средствами операторов. И если уж у вас обе матрицы настолько заковыристые, что их произведение через ухо вычислять быстрее, то и не пользуйтесь тогда операторами, а вызывайте для них функцию, которая вычисляет результат через ухо. В конце концов, языки высокого уровня родились вместе с Фортраном, когда стало допустимо записывать арифметические операции посредством четырех операторов (+,-,*,/), используя скобки, и именно это вызывало бум! Потому как с помощью явного вызова функций можно было бы припеваючи продолжать жить на ассемблере. Отсюда и вопрос мной поставлен так: допускает ли механизм определения операторов языка C++ определить их для матриц и векторов таким образом, чтобы три операции (+,-,*) над ними имели естественно-арифметический вид записи? Если да, то почему это до сих пор не сделано производителями библиотек линейной алгебры? А если где-то уже сделано, то где именно?
|
|
|
|
|
Dec 30 2014, 06:00
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(shf_05 @ Dec 30 2014, 08:40)  Нет, этого я не видела. Но даже и с вашей подачи не могу найти в этой статье место, где бы автор производил умножение C=A*B в операторном виде. Слишком ж там кода много вывалено, что пример, если он и был приведен, то там утонул. Тогда как операции типа A+=B A-=B на реализацию которых упирает автор статьи, очевидно реализуются без проблем, поскольку они бинарны, а не тернарны. Тогда как организовать бинарным оператором операцию умножения в общем случае невозможно, т.к. там продукт может иметь иную размерность, чем каждый из операндов.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|