Jest jedna rzecz, której nie lubię na Matlabie: Czasami próbuje być zbyt inteligentny. Na przykład, jeśli mam negatywny pierwiastek kwadratowy jakWyłącz "inteligentne zachowanie" w Matlab
a = -1; sqrt(a)
Matlab nie wygeneruje błąd, ale przełącza się w milczeniu na liczbach zespolonych. To samo dzieje się w przypadku logarytmów ujemnych. Może to prowadzić do trudnych do znalezienia błędów w bardziej skomplikowanym algorytmie.
Podobny problem jest Matlab „rozwiązuje” cicho niż kwadratowe układy liniowe, jak w poniższym przykładzie:
A=eye(3,2); b=ones(3,1); x = A \ b
Oczywiście x
nie spełnia A*x==b
(rozwiązuje problemu zamiast najmniejszych kwadratów).
Czy istnieje możliwość wyłączenia tych "funkcji", a przynajmniej niech Matlab wydrukuje komunikat ostrzegawczy w takim przypadku? To bardzo by pomogło w wielu sytuacjach.
Zastanawiam się, dlaczego ludzie popierają to pytanie. Myślę, że jest to całkowicie uzasadnione. Co więcej, jestem pewien, że jest wielu ludzi, którzy stracili czas na poszukiwanie subtelnych błędów z powodu opisanego zachowania. – Boris
Sposób, w jaki twoje pytanie brzmi, może brzmieć jak "Naprawdę nie czytałem dokumentacji, która mówi, że Matlab obsługuje liczby zespolone, i to wyjaśnia, co robi operator odwrotnego ukośnika. Czy mogę zmusić Matlaba do zrobienia tego, co fałszywie zakładałem, że to zrobi, ponieważ jestem naprawdę sfrustrowany tym, że nie mogę odczytać dokumentacji? ". Chociaż nie zgadzam się z tobą w sprawie problemu z operatorem odwrotnego ukośnika, zgadzam się, że liczby zespolone mogą wskazywać na problem. Byłoby miło, gdyby w debugerze było "dbstop if complex" oprócz "dbstop if nan/inf". – Jonas
@Jonas Próbowałem sformułować pytanie w taki sposób, aby czytelnik nie miał takiego wrażenia, wydaje mi się, że nie udało mi się :(Masz rację, dokumentacja jest na to doskonale jasna.Myślę, że Matlab "nadużywa" operatora, który może prowadzić do błędów, a to jest złe.Innym często popełnianym błędem przez początkujących jest: A (źle zdefiniowana) funkcja jak 'f = @ (x) x * ((x + 1)/x)' daje wynik 'f ([1,2]) = [1.6,3.2] 'podczas gdy większość początkujących oczekiwałaby wyniku" [2,3] ". W większym programie takie błędy są bardzo trudne do znalezienia. – Boris