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.
Interesujące. '{1,2,4, ;;; 4,5,6 ;;;}' również dozwolone –
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
@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