2015-09-29 14 views
17

byłem zaskoczony dziś odkryć, żeDlaczego przecinek końcowy w poprawnej składni Matlaba w tablicy komórek?

A = {1,2,3} 

i

B = {1,2,3,} 

są zarówno ważne składni w programie MATLAB. Spodziewałbym się, że drugie stwierdzenie spowoduje błąd. Jak najlepiej wiem, produkują identyczne macierze komórkowe (all([A{:}]==[B{:}]) zwraca true).

Czy istnieje przyczyna, dla której dozwolona jest druga składnia? Czy jest to błąd w analizatorze składni? Czy A i B są naprawdę takie same?

Co ciekawe, po to nie dozwolony:

C = {1,2,3,,,} 
+8

Interesujące. '{1,2,4, ;;; 4,5,6 ;;;}' również dozwolone –

+0

Pamiętam, jak odkryłem to dziwactwo języka w [tej odpowiedzi] (http://stackoverflow.com/ a/28334571/3121310), ale nigdy nie szukał wyjaśnień na ten temat od MathWorks. Przypuszczam, że jest to specjalny przypadek, który parser obsługuje podobnie do macierzy z rozmiarem "0" w jednym wymiarze, ale przykład @ LuisMendo podsuwa pytania dotyczące specyfiki. – TroyHaskin

+1

@LuisMendo to, co naprawdę mnie wkurza to to, że kończy się ładny, ciasny prostokąt. Wydaje się, że powinny tam być przynajmniej puste wiersze lub coś takiego ... – chessofnerd

Odpowiedz

23

Są to kolejne domysły, a nie odpowiedź.

Można by sprawdzić Symbol reference i okaże się, że przecinek , może być stosowany jako

polecenia lub oświadczenie Separator

Aby wprowadzić więcej niż jedno polecenie MATLAB lub oświadczenie na tej samej linii , oddzielić każde polecenie lub instrukcję przecinkiem:

for k = 1:10, sum(A(k)), end

W linii

B = {1,2,3,} 

dlatego oczekuje się sprawozdania po 3 istnieje tylko }, co oznacza koniec tablicy komórek, ważnego oświadczenia.


średnik ; ma trzy oficjalne zwyczaje:

Array Row Separator

Kiedy stosowany w nawiasach kwadratowych, aby utworzyć nową tablicę lub złączyć istniejących tablic, średnik tworzy nowy wiersz w tablicy:

A = [5, 8; 3, 4]

Tłumienie wyjścia

Po umieszczeniu na końcu polecenia, średnik mówi MATLAB nie wyświetlaczu dowolnego wyjścia z tego polecenia.W tym przykładzie, MATLAB nie wyświetlacz macierz otrzymaną 100-by-100:

A = ones(100, 100);

poleceń lub komunikat Separator

jak operator przecinka, można wprowadzić więcej niż jedno polecenie MATLAB na linii , oddzielając każde polecenie od średnika. MATLAB tłumi dane wyjściowe dla poleceń zakończonych średnikiem i wyświetla wyjście dla poleceń zakończonych przecinkiem.

W tym przykładzie przypisania do zmiennych A i C kończone są za pomocą średnikiem, a zatem nie są wyświetlane. Ponieważ przypisanie do B jest wyświetlany jest przecinek zakończone wyjście z tej jednej komendy:

A = 12.5; B = 42.7, C = 1.25;

Więc w linii

x = {1,2,3,;5,6,7} 

wynika ważnego komunikatu Array Row Separator po 3,. Następnie oczekuje się nowego wyciągu, który w tym przypadku jest podwójny: . Ważny.


Teraz rozważmy przypadek

x = {1,2,3,;;;;4,5,6;;;} 

jak wyżej po 3, następuje stwierdzenie Array Row Separator, oraz oświadczenie po to przypuszczalnienull statement - NOP zapożyczone z jakiegoś podstawowego rdzenia program napisany w C, co w zasadzie oznacza: nic nie robić. Więc po 3,; następuje trzykrotne "nic nie robić", zanim pojawi się następna instrukcja. Nie ma sensu, ponieważ Matlab mówi: Dodatkowy średnik jest niepotrzebny. - , ale jest ważna.

Umożliwia również bezsensowne rzeczy jak:

if true 
    ; 
end 

A to przypuszczalnie również powód

C = {1,2,3,,,} 

zwraca błąd, ponieważ przecinek , ISN” t a null statement, ale po pierwszym przecinku znajduje się znak oczekiwane oczekiwanie.


Podsumowując: to wygląda dziwnie, ale w rzeczywistości wydaje mi się logiczne, jak Matlab używa dużo C-Code wewnętrznie i rozważa zerowej oświadczenie, wszystko wymienione jest prawidłowa składnia.


Co z innymi langażami?

średniki użyty jak x = [1,2,3,;;;;4,5,6;;;] w Pythonie są nieważne, nawet w przypadku zamierzonego Matlab klonu numpy, chyba że zapakowane w tym niezwykłą składni a = np.matrix('1,2,3;4,5,6').

a = np.matrix('1,2,3,;;;;4,5,6;;;') 

rzucał błąd, a także, jak ; jest interpretowany jako Array Row Separator w każdym przypadku, co sprawia, że ​​kompilator narzekać inconsitent rozmiarach rzędu.

Jednak

x = [1,2,3,] 

obowiązuje również składni w Python i IronPython, jak to jest w VBScript i Lua jak wspomniano w mlepage's answer. Co łączy te wszystkie języki? Wszystkie są (mniej więcej) językami skryptowymi interpretowanymi podczas działania. To nie tylko Matlab. Podekscytowanie PO pozostaje zatem bez przyczyny.

+0

To naprawdę ma sens. Dziękuję za wyjaśnienie. +1. – rayryeng

+6

Byłbym ciekawy, jak rzucić ten sposób MathWorks i zobaczyć, czy odpowiedzą! – excaza

0

Wygodne jest stosowanie końcowej interpunkcji w językach, jeśli kiedykolwiek kod zostanie wygenerowany z innego kodu.

Na przykład Lua zezwala na ciągłe przecinki, więc łatwo jest wygenerować kod Lua.

Nie trzeba specjalnego przypadku kodu generującego, aby pominąć końcowy przecinek, wystarczy wydrukować ELEMENT-THEN-COMMA dla każdego elementu.

+0

Nie, po prostu tego nie rób – Wolfie

Powiązane problemy