MATLAB Language Samouczek
Rozpoczęcie pracy z językiem MATLAB
Szukaj…
Wersje
Wersja | Wydanie | Data wydania |
---|---|---|
1.0 | 1984-01-01 | |
2) | 1986-01-01 | |
3) | 1987-01-01 | |
3.5 | 1990-01-01 | |
4 | 1992-01-01 | |
4.2c | 01.01.1994 | |
5.0 | Tom 8 | 1996-12-01 |
5.1 | Tom 9 | 1997-05-01 |
5.1.1 | R9.1 | 1997-05-02 |
5.2 | R10 | 1998-03-01 |
5.2.1 | R10.1 | 02.02.1998 |
5.3 | R11 | 1999-01-01 |
5.3.1 | R11.1 | 1999-11-01 |
6.0 | R12 | 2000-11-01 |
6.1 | R12.1 | 2001-06-01 |
6.5 | R13 | 2002-06-01 |
6.5.1 | R13SP2 | 01.01.2003 |
6.5.2 | R13SP2 | 2003-01-02 |
7 | R14 | 2006-06-01 |
7.0.4 | R14SP1 | 01.10.2004 |
7.1 | R14SP3 | 2005-08-01 |
7.2 | R2006a | 2006-03-01 |
7.3 | R2006b | 2006-09-01 |
7.4 | R2007a | 01.03.2007 |
7.5 | R2007b | 2007-09-01 |
7.6 | R2008a | 01.03.2008 |
7,7 | R2008b | 01.09.2008 |
7.8 | R2009a | 01.03.2009 |
7,9 | R2009b | 01.09.2009 |
7.10 | R2010a | 01.03.2010 |
7.11 | R2010b | 01.09.2010 |
7.12 | R2011a | 01.03.2011 |
7.13 | R2011b | 01.09.2011 |
7.14 | R2012a | 01.03.2012 |
8.0 | R2012b | 01.09.2012 |
8.1 | R2013a | 01.03.2013 |
8.2 | R2013b | 01.09.2013 |
8.3 | R2014a | 01.03.2014 |
8.4 | R2014b | 01.09.2014 |
8.5 | R2015a | 01.03.2015 |
8.6 | R2015b | 01.09.2015 |
9.0 | R2016a | 01.03.2016 |
9.1 | R2016b | 14.09.2016 |
9.2 | R2017a | 2017-03-08 |
Zobacz także: Historia wydania MATLAB na Wikipedii .
Witaj świecie
Otwórz nowy pusty dokument w edytorze MATLAB (w najnowszych wersjach MATLAB, zrób to, wybierając kartę Narzędzia główne paska narzędzi i klikając Nowy skrypt). Domyślny skrót klawiaturowy do tworzenia nowego skryptu to Ctrl-n
.
Alternatywnie, wpisanie edit myscriptname.m
otworzy plik myscriptname.m
do edycji lub zaoferuje utworzenie pliku, jeśli nie istnieje on na ścieżce MATLAB.
W edytorze wpisz następujące polecenie:
disp('Hello, World!');
Wybierz kartę Edytor paska narzędzi i kliknij przycisk Zapisz jako. Zapisz dokument do pliku w bieżącym katalogu o nazwie helloworld.m
. Zapisanie pliku bez tytułu spowoduje wyświetlenie okna dialogowego z nazwą pliku.
W oknie poleceń MATLAB wpisz następujące polecenie:
>> helloworld
Powinieneś zobaczyć następującą odpowiedź w oknie poleceń MATLAB:
Hello, World!
Widzimy, że w oknie poleceń jesteśmy w stanie wpisać nazwy funkcji lub plików skryptów, które napisaliśmy lub które są dostarczane z MATLAB-em, aby je uruchomić.
Tutaj uruchomiliśmy skrypt „helloworld”. Zauważ, że wpisanie rozszerzenia ( .m
) nie jest konieczne. Instrukcje przechowywane w pliku skryptu są wykonywane przez MATLAB, tutaj wypisuje „Witaj, świecie!” za pomocą funkcji disp
.
Pliki skryptów można zapisać w ten sposób, aby zapisać serię poleceń do późniejszego (ponownego) wykorzystania.
Macierze i tablice
W MATLAB najbardziej podstawowym typem danych jest tablica liczbowa. Może to być skalar, wektor 1-D, macierz 2-D lub macierz wielowymiarowa ND.
% a 1-by-1 scalar value
x = 1;
Aby utworzyć wektor wiersza, wprowadź elementy w nawiasach rozdzielone spacjami lub przecinkami:
% a 1-by-4 row vector
v = [1, 2, 3, 4];
v = [1 2 3 4];
Aby utworzyć wektor kolumny, oddziel elementy średnikami:
% a 4-by-1 column vector
v = [1; 2; 3; 4];
Aby utworzyć macierz, wprowadzamy wiersze jak poprzednio oddzielone średnikami:
% a 2 row-by-4 column matrix
M = [1 2 3 4; 5 6 7 8];
% a 4 row-by-2 column matrix
M = [1 2; ...
4 5; ...
6 7; ...
8 9];
Zauważ, że nie możesz utworzyć macierzy o nierównym rozmiarze wiersza / kolumny. Wszystkie wiersze muszą mieć tę samą długość, a wszystkie kolumny muszą mieć tę samą długość:
% an unequal row / column matrix
M = [1 2 3 ; 4 5 6 7]; % This is not valid and will return an error
% another unequal row / column matrix
M = [1 2 3; ...
4 5; ...
6 7 8; ...
9 10]; % This is not valid and will return an error
Aby transponować wektor lub macierz, używamy .'
-operator lub '
operator podejmuje hermitowskiego koniugatu, która jest sprzężona z jego transponowanie. W przypadku prawdziwych macierzy te dwie są takie same:
% create a row vector and transpose it into a column vector
v = [1 2 3 4].'; % v is equal to [1; 2; 3; 4];
% create a 2-by-4 matrix and transpose it to get a 4-by-2 matrix
M = [1 2 3 4; 5 6 7 8].'; % M is equal to [1 5; 2 6; 3 7; 4 8]
% transpose a vector or matrix stored as a variable
A = [1 2; 3 4];
B = A.'; % B is equal to [1 3; 2 4]
W przypadku tablic o więcej niż dwóch wymiarach nie ma bezpośredniej składni języka, aby wprowadzić je dosłownie. Zamiast tego musimy użyć funkcji do ich skonstruowania (takich jak ones
, zeros
, rand
) lub poprzez manipulowanie inne tablice (przy użyciu funkcji takich jak cat
, reshape
, permute
). Kilka przykładów:
% a 5-by-2-by-4-by-3 array (4-dimensions)
arr = ones(5, 2, 4, 3);
% a 2-by-3-by-2 array (3-dimensions)
arr = cat(3, [1 2 3; 4 5 6], [7 8 9; 0 1 2]);
% a 5-by-4-by-3-by-2 (4-dimensions)
arr = reshape(1:120, [5 4 3 2]);
Indeksowanie macierzy i tablic
MATLAB pozwala na kilka metod indeksowania (dostępu) elementów macierzy i tablic:
- Indeksowanie indeksu dolnego - gdzie określasz pozycję elementów, które chcesz w każdym wymiarze macierzy osobno.
- Indeksowanie liniowe - gdzie macierz jest traktowana jako wektor, bez względu na jego wymiary. Oznacza to, że każdą pozycję w macierzy określasz za pomocą pojedynczej liczby.
- Indeksowanie logiczne - gdy używasz macierzy logicznej (i macierzy wartości
true
ifalse
) z identycznymi wymiarami macierzy, którą próbujesz zindeksować jako maskę, aby określić, którą wartość zwrócić.
Te trzy metody są teraz wyjaśnione bardziej szczegółowo na przykładzie następującej macierzy M
3 na 3 jako przykładu:
>> M = magic(3)
ans =
8 1 6
3 5 7
4 9 2
Indeksowanie indeksu dolnego
Najprostszą metodą dostępu do elementu jest określenie indeksu wiersza i kolumny. Na przykład dostęp do elementu w drugim wierszu i trzeciej kolumnie:
>> M(2, 3)
ans =
7
Podana liczba indeksów dolnych dokładnie odpowiada liczbie wymiarów M
(dwa w tym przykładzie).
Zauważ, że kolejność indeksów dolnych jest taka sama jak w konwencji matematycznej: indeks wierszy jest pierwszy. Ponadto indeksy MATLAB zaczynają się od 1
a nie od 0
jak większość języków programowania.
Możesz indeksować wiele elementów jednocześnie, przekazując wektor dla każdej współrzędnej zamiast pojedynczej liczby. Na przykład, aby uzyskać cały drugi wiersz, możemy określić, że chcemy pierwszą, drugą i trzecią kolumnę:
>> M(2, [1,2,3])
ans =
3 5 7
W MATLAB wektor [1,2,3]
można łatwiej utworzyć za pomocą operatora dwukropka, tj. 1:3
. Możesz użyć tego również w indeksowaniu. Aby zaznaczyć cały wiersz (lub kolumna), MATLAB zapewnia skrót pozwalając Wystarczy podać :
. Na przykład poniższy kod zwróci również cały drugi wiersz
>> M(2, :)
ans =
3 5 7
MATLAB zapewnia również skrót do określania ostatniego elementu wymiaru w postaci słowa kluczowego end
. end
kluczowe end
będzie działać dokładnie tak, jakby był numerem ostatniego elementu w tym wymiarze. Więc jeśli chcesz wszystkie kolumny od kolumny 2
do ostatniej kolumny, możesz napisać:
>> M(2, 2:end)
ans =
5 7
Indeksowanie indeksu dolnego może być restrykcyjne, ponieważ nie pozwoli wyodrębnić pojedynczych wartości z różnych kolumn i wierszy; wyodrębni kombinację wszystkich wierszy i kolumn.
>> M([2,3], [1,3])
ans =
3 7
4 2
Na przykład indeksowanie indeksu dolnego nie może wyodrębniać tylko elementów M(2,1)
lub M(3,3)
. Aby to zrobić, musimy rozważyć indeksowanie liniowe.
Indeksowanie liniowe
MATLAB pozwala traktować tablice n-wymiarowe jako tablice jednowymiarowe, gdy indeksujesz używając tylko jednego wymiaru. Możesz bezpośrednio uzyskać dostęp do pierwszego elementu:
>> M(1)
ans =
8
Zauważ, że tablice są przechowywane w MATLAB w porządku głównym kolumny, co oznacza, że uzyskujesz dostęp do elementów, najpierw schodząc po kolumnach. Zatem M(2)
jest drugim elementem pierwszej kolumny, który ma wartość 3
a M(4)
będzie pierwszym elementem drugiej kolumny, tj.
>> M(4)
ans =
1
W MATLAB-ie istnieją wbudowane funkcje do konwersji indeksów indeksu dolnego na indeks liniowy i odwrotnie: odpowiednio sub2ind
i ind2sub
. Możesz ręcznie przekonwertować indeksy dolne ( r
, c
) na indeks liniowy za pomocą
idx = r + (c-1)*size(M,1)
Aby to zrozumieć, jeśli znajdujemy się w pierwszej kolumnie, wówczas indeks liniowy będzie po prostu indeksem wiersza. Powyższa formuła jest prawdziwa, ponieważ dla c == 1
, (c-1) == 0
. W następnych kolumnach indeks liniowy to numer wiersza plus wszystkie wiersze poprzednich kolumn.
Zauważ, że słowo kluczowe end
wciąż obowiązuje i teraz odnosi się do ostatniego elementu tablicy, tj. M(end) == M(end, end) == 2
.
Można również indeksować wiele elementów za pomocą indeksowania liniowego. Zauważ, że jeśli to zrobisz, zwrócona macierz będzie miała taki sam kształt jak macierz wektorów indeksowych.
M(2:4)
zwraca wektor wiersza, ponieważ 2:4
reprezentuje wektor wiersza [2,3,4]
:
>> M(2:4)
ans =
3 4 1
W innym przykładzie M([1,2;3,4])
zwraca macierz 2 na 2, ponieważ [1,2;3,4]
jest również macierzą 2 na 2. Zobacz poniższy kod, aby się przekonać:
>> M([1,2;3,4])
ans =
8 3
4 1
Zauważ, że indeksowanie za pomocą :
alone zawsze zwróci wektor kolumny:
>> M(:)
ans =
8
3
4
1
5
9
6
7
2
Ten przykład ilustruje również kolejność, w której MATLAB zwraca elementy podczas korzystania z indeksowania liniowego.
Indeksowanie logiczne
Trzecią metodą indeksowania jest użycie matrycy logicznej, tj. Macierzy zawierającej tylko wartości true
lub false
, jako maski do odfiltrowywania elementów, których nie chcesz. Na przykład, jeśli chcemy znaleźć wszystkie elementy M
które są większe niż 5
, możemy użyć macierzy logicznej
>> M > 5
ans =
1 0 1
0 0 1
0 1 0
indeksować M
i zwracać tylko wartości większe niż 5
w następujący sposób:
>> M(M > 5)
ans =
8
9
6
7
Jeśli chcesz, aby te liczby pozostały na miejscu (tj. Zachowały kształt matrycy), możesz przypisać do komplementu logicznego
>> M(~(M > 5)) = NaN
ans =
8 NaN 6
NaN NaN 7
NaN 9 Nan
Możemy ograniczyć skomplikowane bloki kodu zawierające instrukcje if
i for
, stosując indeksowanie logiczne.
Weź nie wektoryzowaną (już skróconą do pojedynczej pętli za pomocą indeksowania liniowego):
for elem = 1:numel(M)
if M(elem) > 5
M(elem) = M(elem) - 2;
end
end
Można to skrócić do następującego kodu za pomocą indeksowania logicznego:
idx = M > 5;
M(idx) = M(idx) - 2;
Lub nawet krócej:
M(M > 5) = M(M > 5) - 2;
Więcej na temat indeksowania
Matryce o wyższych wymiarach
Wszystkie wyżej wymienione metody uogólniają się na n-wymiary. Jeśli użyjemy na przykład trójwymiarowej macierzy M3 = rand(3,3,3)
, możesz uzyskać dostęp do wszystkich wierszy i kolumn drugiego wycinka trzeciego wymiaru, pisząc
>> M(:,:,2)
Możesz uzyskać dostęp do pierwszego elementu drugiego wycinka za pomocą indeksowania liniowego. Indeksowanie liniowe przejdzie do drugiego wycinka dopiero po wszystkich wierszach i wszystkich kolumnach pierwszego wycinka. Tak więc indeks liniowy tego elementu wynosi
>> M(size(M,1)*size(M,2)+1)
W rzeczywistości w MATLAB każda macierz jest n-wymiarowa: zdarza się, że rozmiar większości innych n-wymiarów jest jeden. Jeśli więc a = 2
to a(1) == 2
(jak można się spodziewać), ale także a(1, 1) == 2
, podobnie jak a(1, 1, 1) == 2
, a(1, 1, 1, ..., 1) == 2
i tak dalej. Te „dodatkowe” wymiary (o rozmiarze 1
) są nazywane wymiarami singleton . Komenda squeeze
usunie je i można użyć permute
aby zamienić kolejność wymiarów wokół (i wprowadzić wymiary singleton, jeśli to konieczne).
Matrycę n-wymiarową można również indeksować za pomocą m indeksów dolnych (gdzie m <= n). Zasadą jest, że pierwsze indeksy dolne m-1 zachowują się normalnie, podczas gdy ostatni indeks indeksowy (m-ty) odwołuje się do pozostałych wymiarów (n-m + 1), podobnie jak indeks liniowy odnosi się do wymiaru (n-m + 1) szyk. Oto przykład:
>> M = reshape(1:24,[2,3,4]);
>> M(1,1)
ans =
1
>> M(1,10)
ans =
19
>> M(:,:)
ans =
1 3 5 7 9 11 13 15 17 19 21 23
2 4 6 8 10 12 14 16 18 20 22 24
Zwracające zakresy elementów
W przypadku indeksowania indeksu dolnego, jeśli określisz więcej niż jeden element w więcej niż jednym wymiarze, MATLAB zwraca każdą możliwą parę współrzędnych. Na przykład, jeśli spróbujesz M ([1,2], [1,3]) MATLAB zwróci M(1,1)
i M(2,3)
ale zwróci również M(1,3)
i M(2,1)
. Może to wydawać się nieintuicyjne, gdy szukasz elementów do listy par współrzędnych, ale weź przykład większej matrycy, A = rand(20)
(uwaga A
ma teraz 20
20
), gdzie chcesz uzyskać prawy górny kwadrant. W tym przypadku zamiast określać każdą parę współrzędnych w tej ćwiartce (i w tym przypadku byłoby to 100
par), wystarczy podać 10
wierszy i 10
kolumn, które mają być A(1:10, 11:end)
. Krojenie takiej macierzy jest znacznie częstsze niż wymaganie listy par współrzędnych.
Jeśli chcesz uzyskać listę par współrzędnych, najprostszym rozwiązaniem jest konwersja na indeksowanie liniowe. Rozważ problem polegający na tym, że masz wektor indeksów kolumn, które chcesz zwrócić, gdzie każdy wiersz wektora zawiera numer kolumny, który chcesz zwrócić dla odpowiedniego wiersza macierzy. Na przykład
colIdx = [3;2;1]
Więc w tym przypadku faktycznie chcesz odzyskać elementy w (1,3)
, (2,2)
i (3,1)
. Zatem za pomocą indeksowania liniowego:
>> colIdx = [3;2;1];
>> rowIdx = 1:length(colIdx);
>> idx = sub2ind(size(M), rowIdx, colIdx);
>> M(idx)
ans =
6 5 4
Wielokrotne zwracanie elementu
Dzięki indeksowi dolnemu i indeksowaniu liniowemu możesz również zwrócić element wiele razy, powtarzając jego indeks tak
>> M([1,1,1,2,2,2])
ans =
8 8 8 3 3 3
Możesz użyć tego do powielenia całych wierszy i kolumn, na przykład w celu powtórzenia pierwszego wiersza i ostatniej kolumny
>> M([1, 1:end], [1:end, end])
ans =
8 1 6 6
8 1 6 6
3 5 7 7
4 9 2 2
Aby uzyskać więcej informacji, zobacz tutaj .
Pomagać sobie
MATLAB zawiera wiele wbudowanych skryptów i funkcji, od prostego mnożenia po narzędzia do rozpoznawania obrazów. Aby uzyskać informacje o funkcji, której chcesz użyć, wpisz: help functionname
nazwa help functionname
w wierszu polecenia. Weźmy jako przykład funkcję help
.
Informacje na temat korzystania z niego można uzyskać, wpisując:
>> help help
w oknie poleceń. Zwróci to informację o użyciu help
funkcji. Jeśli informacje, których szukasz, są nadal niejasne, możesz wypróbować stronę dokumentacji funkcji. Po prostu wpisz:
>> doc help
w oknie poleceń. Spowoduje to otwarcie dostępnej do przeglądania dokumentacji na stronie help
funkcji, zawierającej wszystkie informacje potrzebne do zrozumienia, w jaki sposób działa „pomoc”.
Ta procedura działa dla wszystkich wbudowanych funkcji i symboli.
Podczas opracowywania własnych funkcji możesz pozwolić im mieć własną sekcję pomocy, dodając komentarze na górze pliku funkcji lub tuż po deklaracji funkcji.
Przykład prostej funkcji multiplyby2
zapisanej w pliku multiplyby2.m
function [prod]=multiplyby2(num)
% function MULTIPLYBY2 accepts a numeric matrix NUM and returns output PROD
% such that all numbers are multiplied by 2
prod=num*2;
end
lub
% function MULTIPLYBY2 accepts a numeric matrix NUM and returns output PROD
% such that all numbers are multiplied by 2
function [prod]=multiplyby2(num)
prod=num*2;
end
Jest to bardzo przydatne, gdy odbierasz kod tygodnie / miesiące / lata po jego napisaniu.
Funkcje help
i doc
dostarczają wielu informacji, nauczenie się korzystania z tych funkcji pomoże ci szybko się rozwijać i efektywnie korzystać z MATLAB-a.
Odczytywanie danych wejściowych i zapisywanie danych wyjściowych
Podobnie jak wszystkie języki programowania, Matlab został zaprojektowany do czytania i pisania w wielu różnych formatach. Natywna biblioteka obsługuje wiele formatów tekstu, obrazu, wideo, audio i danych, a przy każdej aktualizacji wersji znajduje się więcej formatów - sprawdź tutaj, aby zobaczyć pełną listę obsługiwanych formatów plików i funkcji, które należy użyć, aby je zaimportować.
Zanim spróbujesz załadować plik, musisz zadać sobie pytanie, czym mają się stać dane i w jaki sposób komputer zorganizuje dane za Ciebie. Załóżmy, że masz plik txt / csv w następującym formacie:
Fruit,TotalUnits,UnitsLeftAfterSale,SellingPricePerUnit
Apples,200,67,$0.14
Bananas,300,172,$0.11
Pineapple,50,12,$1.74
Widzimy, że pierwsza kolumna ma format Ciągów, podczas gdy druga, trzecia jest Liczbowa, a ostatnia kolumna ma postać Waluty. Powiedzmy, że chcemy dowiedzieć się, ile dzisiaj zarobiliśmy przy użyciu Matlaba, i najpierw chcemy załadować ten plik txt / csv. Po sprawdzeniu linku możemy zobaczyć, że pliki tekstowe typu String i Numeric są obsługiwane przez textscan
. Więc możemy spróbować:
fileID = fopen('dir/test.txt'); %Load file from dir
C = textscan(fileID,'%s %f %f %s','Delimiter',',','HeaderLines',1); %Parse in the txt/csv
gdzie %s
sugeruje, że element jest typu String, %f
sugeruje, że element jest typu Float i że plik jest ograniczony przez „,”. Opcja HeaderLines prosi Matlab o pominięcie pierwszych N linii, a 1 bezpośrednio po nim oznacza pominięcie pierwszej linii (linii nagłówka).
Teraz C to załadowane dane, które są w postaci tablicy komórek zawierającej 4 komórki, z których każda zawiera kolumnę danych w pliku txt / csv.
Najpierw chcemy obliczyć, ile owoców sprzedaliśmy dzisiaj, odejmując trzecią kolumnę od drugiej kolumny, można to zrobić przez:
sold = C{2} - C{3}; %C{2} gives the elements inside the second cell (or the second column)
Teraz chcemy pomnożyć ten wektor przez cenę za jednostkę, więc najpierw musimy przekonwertować tę kolumnę ciągów na kolumnę liczb, a następnie przekonwertować ją na macierz numeryczną za pomocą cell2mat
Matlaba. Pierwszą rzeczą, którą musimy zrobić, to usunąć poza znakiem „$” można to zrobić na wiele sposobów. Najbardziej bezpośrednim sposobem jest użycie prostego wyrażenia regularnego:
D = cellfun(@(x)(str2num(regexprep(x, '\$',''))), C{4}, 'UniformOutput', false);%cellfun allows us to avoid looping through each element in the cell.
Lub możesz użyć pętli:
for t=1:size(C{4},1)
D{t} = str2num(regexprep(C{4}{t}, '\$',''));
end
E = cell2mat(D)% converts the cell array into a Matrix
Funkcja str2num
zamienia ciąg znaków, w którym znaki „$” są cell2mat
na typy numeryczne, a cell2mat
zamienia komórkę elementów numerycznych w macierz liczb
Teraz możemy pomnożyć sprzedane jednostki przez koszt jednostkowy:
revenue = sold .* E; %element-wise product is denoted by .* in Matlab
totalrevenue = sum(revenue);
Macierze komórkowe
Elementy tej samej klasy często można łączyć w tablice (z kilkoma rzadkimi wyjątkami, np. Uchwytami funkcji). Skalary numeryczne, domyślnie double
klasy, mogą być przechowywane w macierzy.
>> A = [1, -2, 3.14, 4/5, 5^6; pi, inf, 7/0, nan, log(0)]
A =
1.0e+04 *
0.0001 -0.0002 0.0003 0.0001 1.5625
0.0003 Inf Inf NaN -Inf
Postacie, które są klasy char
MATLAB, mogą być przechowywane w tablicy stosując podobną składnię. Taka tablica jest podobna do łańcucha w wielu innych językach programowania.
>> s = ['MATLAB ','is ','fun']
s =
MATLAB is fun
Zauważ, że pomimo tego, że oba używają nawiasów [
i ]
, klasy wynikowe są różne. Dlatego operacje, które można na nich wykonać, są również różne.
>> whos
Name Size Bytes Class Attributes
A 2x5 80 double
s 1x13 26 char
W rzeczywistości tablica s
nie jest tablicą ciągów 'MATLAB '
, 'is '
i 'fun'
, to tylko jeden ciąg - tablica 13 znaków. Otrzymalibyśmy te same wyniki, gdyby zostały zdefiniowane przez jeden z poniższych:
>> s = ['MAT','LAB ','is f','u','n'];
>> s = ['M','A','T','L','A','B,' ','i','s',' ','f','u','n'];
Zwykły wektor MATLAB nie pozwala przechowywać kombinacji zmiennych różnych klas lub kilku różnych ciągów. Tutaj przydaje się tablica cell
. Jest to tablica komórek, z których każda może zawierać jakiś obiekt MATLAB, którego klasa może być inna w każdej komórce, jeśli zajdzie taka potrzeba. Użyj nawiasów klamrowych {
i }
wokół elementów, aby przechowywać w tablicy komórek.
>> C = {A; s}
C =
[2x5 double]
'MATLAB is fun'
>> whos C
Name Size Bytes Class Attributes
C 2x1 330 cell
Standardowe obiekty MATLAB dowolnej klasy mogą być przechowywane razem w tablicy komórkowej. Pamiętaj, że tablice komórkowe wymagają więcej pamięci do przechowywania ich zawartości.
Dostęp do zawartości komórki odbywa się za pomocą nawiasów klamrowych {
i }
.
>> C{1}
ans =
1.0e+04 *
0.0001 -0.0002 0.0003 0.0001 1.5625
0.0003 Inf Inf NaN -Inf
Zauważ, że C(1)
różni się od C{1}
. Podczas gdy ten drugi zwraca zawartość komórki (i ma double
klasę w naszym przykładzie), drugi zwraca tablicę komórek, która jest pod-tablicą C
Podobnie, gdyby D
był macierzą 10 na 5 komórek, to D(4:8,1:3)
zwróciłoby pod-macierz D
o rozmiarze 5 na 3 i którego klasą jest cell
. A składnia C{1:2}
nie ma pojedynczego zwróconego obiektu, ale później zwraca 2 różne obiekty (podobne do funkcji MATLAB z wieloma zwracanymi wartościami):
>> [x,y] = C{1:2}
x =
1 -2 3.14 0.8 15625
3.14159265358979 Inf Inf NaN -Inf
y =
MATLAB is fun
Skrypty i funkcje
Kod MATLAB można zapisać w plikach m do ponownego wykorzystania. Pliki m mają rozszerzenie .m
które jest automatycznie kojarzone z MATLAB. Plik m może zawierać skrypt lub funkcje.
Skrypty
Skrypty to po prostu pliki programów, które wykonują serię poleceń MATLAB w określonej kolejności.
Skrypty nie akceptują danych wejściowych ani nie zwracają danych wyjściowych. Funkcjonalnie skrypty są równoważne wpisywaniu poleceń bezpośrednio w oknie poleceń MATLAB i są w stanie je odtworzyć.
Przykład skryptu:
length = 10;
width = 3;
area = length * width;
Ten skrypt określi length
, width
i area
w bieżącym obszarze roboczym o wartości odpowiednio 10
, 3
i 30
.
Jak wspomniano wcześniej, powyższy skrypt jest funkcjonalnie równoważny z wpisywaniem tych samych poleceń bezpośrednio w oknie poleceń.
>> length = 10;
>> width = 3;
>> area = length * width;
Funkcje
Funkcje w porównaniu ze skryptami są znacznie bardziej elastyczne i rozszerzalne. W przeciwieństwie do skryptów funkcje mogą akceptować dane wejściowe i zwracać dane wyjściowe do programu wywołującego. Funkcja ma własny obszar roboczy, co oznacza, że wewnętrzne operacje funkcji nie zmienią zmiennych z obiektu wywołującego.
Wszystkie funkcje są zdefiniowane w tym samym formacie nagłówka:
function [output] = myFunctionName(input)
function
kluczowe function
rozpoczyna każdy nagłówek funkcji. Lista wyników znajduje się poniżej. Lista wyników może być również rozdzielaną przecinkami listą zmiennych do zwrócenia.
function [a, b, c] = myFunctionName(input)
Dalej jest nazwa funkcji, która będzie używana do wywoływania. Jest to na ogół taka sama nazwa jak nazwa pliku. Na przykład myFunctionName.m
tę funkcję jako myFunctionName.m
.
Po nazwie funkcji znajduje się lista wejść. Podobnie jak dane wyjściowe, może to być także lista rozdzielana przecinkami.
function [a, b, c] = myFunctionName(x, y, z)
Możemy przepisać przykładowy skrypt z wcześniejszej wersji jako funkcję wielokrotnego użytku, jak poniżej:
function [area] = calcRecArea(length, width)
area = length * width;
end
Możemy wywoływać funkcje z innych funkcji, a nawet z plików skryptów. Oto przykład naszej powyższej funkcji używanej w pliku skryptu.
l = 100;
w = 20;
a = calcRecArea(l, w);
Jak poprzednio, tworzenie l
, w
i w przestrzeni roboczej o wartościach a
100
, 20
i 2000
, odpowiednio.
Typy danych
W MATLAB istnieje 16 podstawowych typów danych lub klas. Każda z tych klas ma postać macierzy lub tablicy. Z wyjątkiem uchwytów funkcji, ta matryca lub tablica ma rozmiar co najmniej 0 na 0 i może urosnąć do n-wymiarowej tablicy o dowolnym rozmiarze. Uchwyt funkcyjny jest zawsze skalarny (1 na 1).
Ważnym momentem w MATLAB jest to, że domyślnie nie musisz używać deklaracji typu ani instrukcji wymiarów. Po zdefiniowaniu nowej zmiennej MATLAB tworzy ją automatycznie i przydziela odpowiednią przestrzeń pamięci.
Przykład:
a = 123;
b = [1 2 3];
c = '123';
>> whos
Name Size Bytes Class Attributes
a 1x1 8 double
b 1x3 24 double
c 1x3 6 char
Jeśli zmienna już istnieje, MATLAB zastępuje oryginalne dane nowymi i w razie potrzeby przydziela nowe miejsce do przechowywania.
Podstawowe typy danych
Podstawowe typy danych to: numeryczna, logical
, char
, cell
, struct
, table
i function_handle
.
Liczby zmiennoprzecinkowe ( domyślne )
MATLAB reprezentuje liczby zmiennoprzecinkowe w formacie podwójnej precyzji lub pojedynczej precyzji. Domyślną wartością jest podwójna precyzja, ale można wykonać dowolną pojedynczą precyzję za pomocą prostej funkcji konwersji:
a = 1.23; b = single(a); >> whos Name Size Bytes Class Attributes a 1x1 8 double b 1x1 4 single
MATLAB ma cztery klasy całkowite ze znakiem i cztery bez znaku. Typy ze znakiem umożliwiają pracę zarówno z liczbami całkowitymi ujemnymi, jak i dodatnimi, ale nie mogą reprezentować tak szerokiego zakresu liczb, jak typy niepodpisane, ponieważ jeden bit służy do oznaczenia liczby dodatniej lub ujemnej. Typy niepodpisane dają szerszy zakres liczb, ale liczby te mogą być zerowe lub dodatnie.
MATLAB obsługuje 1-, 2-, 4- i 8-bajtowe przechowywanie danych całkowitych. Możesz zaoszczędzić pamięć i czas wykonywania programów, jeśli użyjesz najmniejszego typu liczby całkowitej, który pomieści twoje dane. Na przykład nie potrzebujesz 32-bitowej liczby całkowitej do przechowywania wartości 100.
a = int32(100); b = int8(100); >> whos Name Size Bytes Class Attributes a 1x1 4 int32 b 1x1 1 int8
Aby przechowywać dane jako liczby całkowite, musisz przekonwertować z podwójnego na pożądany typ liczby całkowitej. Jeśli liczba przekształcana na liczbę całkowitą ma część ułamkową, MATLAB zaokrągla liczbę do najbliższej liczby całkowitej. Jeśli część ułamkowa wynosi dokładnie
0.5
, to z dwóch równie bliskich liczb całkowitych MATLAB wybiera tę, dla której wartość bezwzględna jest większa.a = int16(456);
-
Tablice znaków zapewniają przechowywanie danych tekstowych w MATLAB. Zgodnie z tradycyjną terminologią programowania tablica (sekwencja) znaków jest zdefiniowana jako ciąg. W detalicznych wydaniach MATLAB nie ma wyraźnego typu ciągu.
logiczne: wartości logiczne 1 lub 0 reprezentują odpowiednio prawdę i fałsz. Użyj do warunków relacyjnych i indeksowania tablicy. Ponieważ jest to PRAWDA lub FAŁSZ, ma rozmiar 1 bajtu.
a = logical(1);
Struktura. Tablica struktur to typ danych, który grupuje zmienne różnych typów danych przy użyciu kontenerów danych zwanych polami . Każde pole może zawierać dowolny typ danych. Uzyskaj dostęp do danych w strukturze za pomocą notacji kropkowej w formie structName.fieldName.
field1 = 'first'; field2 = 'second'; value1 = [1 2 3 4 5]; value2 = 'sometext'; s = struct(field1,value1,field2,value2);
Aby uzyskać dostęp do wartości 1, każda z poniższych składni jest równoważna
s.first or s.(field1) or s.('first')
Możemy jawnie uzyskać dostęp do pola, o którym wiemy, że będzie istniało za pomocą pierwszej metody, albo przekazać ciąg lub utworzyć ciąg, aby uzyskać dostęp do pola w drugim przykładzie. Trzecim przykładem jest wykazanie, że notacja kropkowa w nawiasie macierzystym pobiera ciąg znaków, który jest taki sam, jak przechowywany w zmiennej field1.
Zmienne tabeli mogą mieć różne rozmiary i typy danych, ale wszystkie zmienne muszą mieć tę samą liczbę wierszy.
Age = [15 25 54]'; Height = [176 190 165]'; Name = {'Mike', 'Pete', 'Steeve'}'; T = table(Name,Age, Height);
komórka. Jest to bardzo przydatny typ danych MATLAB: tablica komórek to tablica, której każdy element może mieć inny typ danych i rozmiar. To bardzo silny instrument do manipulowania danymi według własnego uznania.
a = { [1 2 3], 56, 'art'};
lub
a = cell(3);
uchwyty funkcji przechowują wskaźnik do funkcji (na przykład do funkcji anonimowej). Umożliwia przekazanie funkcji do innej funkcji lub wywołanie funkcji lokalnych spoza głównej funkcji.
Istnieje wiele instrumentów do pracy z każdym typem danych, a także wbudowane funkcje konwersji typu danych ( str2double
, table2cell
).
Dodatkowe typy danych
Istnieje kilka dodatkowych typów danych, które są przydatne w niektórych szczególnych przypadkach. Oni są:
Data i godzina: tablice reprezentujące daty, czas i czas trwania.
datetime('now')
zwraca21-Jul-2016 16:30:16
.21-Jul-2016 16:30:16
.Tablice jakościowe: to typ danych do przechowywania danych z wartościami z zestawu dyskretnych kategorii. Przydatne do przechowywania danych nieliczbowych (efektywna pamięć). Może być używany w tabeli do wybierania grup wierszy.
a = categorical({'a' 'b' 'c'});
Kontenery map to struktura danych, która ma unikalną zdolność do indeksowania nie tylko dowolnych skalarnych wartości liczbowych, ale także wektora znaków. Wskaźniki w elementach mapy nazywane są kluczami. Te klucze wraz z powiązanymi z nimi wartościami danych są przechowywane w Mapie.
Szeregi czasowe to wektory danych próbkowane w czasie, w kolejności, często w regularnych odstępach czasu. Przydatne jest przechowywanie danych związanych z timesteps i ma wiele przydatnych metod do pracy.
Anonimowe funkcje i uchwyty funkcji
Podstawy
Anonimowe funkcje są potężnym narzędziem języka MATLAB. Są to funkcje istniejące lokalnie, to znaczy: w bieżącym obszarze roboczym. Jednak nie istnieją one na ścieżce MATLAB, jak zwykła funkcja, np. W pliku m. Dlatego nazywane są anonimowymi, chociaż mogą mieć nazwę podobną do zmiennej w obszarze roboczym.
Operator @
Użyj operatora @
, aby utworzyć anonimowe funkcje i uchwyty funkcji. Na przykład, aby utworzyć uchwyt funkcji sin
(sinus) i użyć jej jako f
:
>> f = @sin
f =
@sin
Teraz f
jest uchwytem funkcji sin
. Tak jak (w prawdziwym życiu) klamka jest sposobem na użycie drzwi, klamka funkcyjna jest sposobem na użycie funkcji. Aby użyć f
, argumenty są przekazywane do niego tak, jakby to była funkcja sin
:
>> f(pi/2)
ans =
1
f
akceptuje wszelkie argumenty wejściowe, które akceptuje funkcja sin
. Jeśli sin
byłby funkcją, która akceptuje zerowe argumenty wejściowe (czego nie robi, ale inni tak, np. Funkcja peaks
), f()
byłoby użyte do wywołania go bez argumentów wejściowych.
Niestandardowe anonimowe funkcje
Anonimowe funkcje jednej zmiennej
Utworzenie dojścia do istniejącej funkcji, takiej jak sin
w powyższym przykładzie, nie jest oczywiście przydatne. W tym przykładzie jest to trochę zbędne. Przydatne jest jednak tworzenie anonimowych funkcji, które wykonują czynności niestandardowe, które w innym przypadku wymagałyby wielokrotnego powtarzania lub dla których utworzono osobną funkcję. Jako przykład niestandardowej funkcji anonimowej, która przyjmuje jedną zmienną jako dane wejściowe, zsumuj sinus i cosinus do kwadratu sygnału:
>> f = @(x) sin(x)+cos(x).^2
f =
@(x)sin(x)+cos(x).^2
Teraz f
akceptuje jeden argument wejściowy o nazwie x
. Zostało to określone za pomocą nawiasów (...)
bezpośrednio po operatorze @
. f
jest teraz anonimową funkcją x
: f(x)
. Jest używany przez przekazanie wartości x
do f
:
>> f(pi)
ans =
1.0000
Wektor wartości lub zmienną można również przekazać do f
, o ile są one używane w prawidłowy sposób w ramach f
:
>> f(1:3) % pass a vector to f
ans =
1.1334 1.0825 1.1212
>> n = 5:7;
>> f(n) % pass n to f
ans =
-0.8785 0.6425 1.2254
Anonimowe funkcje więcej niż jednej zmiennej
W ten sam sposób można tworzyć anonimowe funkcje, aby zaakceptować więcej niż jedną zmienną. Przykład anonimowej funkcji, która akceptuje trzy zmienne:
>> f = @(x,y,z) x.^2 + y.^2 - z.^2
f =
@(x,y,z)x.^2+y.^2-z.^2
>> f(2,3,4)
ans =
-3
Parametryzowanie funkcji anonimowych
Zmienne w obszarze roboczym mogą być używane w definicji funkcji anonimowych. Nazywa się to parametryzacją. Na przykład, aby użyć stałej c = 2
w funkcji anonimowej:
>> c = 2;
>> f = @(x) c*x
f =
@(x)c*x
>> f(3)
ans =
6
f(3)
użył zmiennej c
jako parametru do pomnożenia przez podany x
. Zauważ, że jeśli wartość c
jest ustawiona na coś innego w tym momencie, wówczas wywoływana jest f(3)
, wynik nie byłby inny. Wartość c
jest wartością w momencie tworzenia funkcji anonimowej:
>> c = 2;
>> f = @(x) c*x;
>> f(3)
ans =
6
>> c = 3;
>> f(3)
ans =
6
Argumenty wejściowe do funkcji anonimowej nie odnoszą się do zmiennych obszaru roboczego
Zauważ, że użycie nazwy zmiennych w obszarze roboczym jako jednego z argumentów wejściowych funkcji anonimowej (tj. Użycie @(...)
) nie użyje wartości tych zmiennych. Zamiast tego są one traktowane jako różne zmienne w zakresie funkcji anonimowej, to znaczy: funkcja anonimowa ma swój prywatny obszar roboczy, w którym zmienne wejściowe nigdy nie odnoszą się do zmiennych z głównego obszaru roboczego. Główny obszar roboczy i obszar roboczy funkcji anonimowej nie znają się nawzajem. Przykład ilustrujący to:
>> x = 3 % x in main workspace
x =
3
>> f = @(x) x+1; % here x refers to a private x variable
>> f(5)
ans =
6
>> x
x =
3
Wartość x
z głównego obszaru roboczego nie jest używana w obrębie f
. Ponadto w głównym obszarze roboczym x
pozostało nietknięte. W zakresie f
nazwy zmiennych między nawiasami po operatorze @
są niezależne od głównych zmiennych obszaru roboczego.
Funkcje anonimowe są przechowywane w zmiennych
Funkcja anonimowa (lub ściślej uchwyt funkcji wskazujący na funkcję anonimową) jest przechowywana jak każda inna wartość w bieżącym obszarze roboczym: w zmiennej (jak to zrobiliśmy powyżej), w tablicy komórkowej ( {@(x)x.^2,@(x)x+1}
), a nawet we właściwości (takiej jak h.ButtonDownFcn
dla grafiki interaktywnej). Oznacza to, że anonimową funkcję można traktować jak każdą inną wartość. Gdy jest przechowywany w zmiennej, ma nazwę w bieżącym obszarze roboczym i może być zmieniany i usuwany tak jak zmienne zawierające liczby.
Mówiąc inaczej: Uchwyt funkcji (w postaci @sin
lub funkcji anonimowej) to po prostu wartość, którą można zapisać w zmiennej, tak jak może być w macierzy numerycznej.
Zaawansowane użycie
Przekazywanie uchwytów funkcji do innych funkcji
Ponieważ uchwyty funkcji są traktowane jak zmienne, można je przekazywać do funkcji, które przyjmują uchwyty funkcji jako argumenty wejściowe.
Przykład: funkcja jest tworzona w pliku m, który akceptuje uchwyt funkcji i liczbę skalarną. Następnie wywołuje uchwyt funkcji, przekazując mu 3
, a następnie dodaje wynik skalarny do wyniku. Wynik jest zwracany.
Zawartość funHandleDemo.m
:
function y = funHandleDemo(fun,x)
y = fun(3);
y = y + x;
Zapisz go gdzieś na ścieżce, np. W bieżącym folderze MATLAB. Teraz funHandleDemo
może być używany w następujący sposób, na przykład:
>> f = @(x) x^2; % an anonymous function
>> y = funHandleDemo(f,10) % pass f and a scalar to funHandleDemo
y =
19
Uchwyt innej istniejącej funkcji można przekazać do funHandleDemo
:
>> y = funHandleDemo(@sin,-5)
y =
-4.8589
Zauważ, że @sin
był szybkim sposobem na uzyskanie dostępu do funkcji sin
bez uprzedniego zapisania jej w zmiennej za pomocą f = @sin
.
Używanie bsxfun
, cellfun
i podobnych funkcji z funkcjami anonimowymi
MATLAB ma kilka wbudowanych funkcji, które przyjmują anonimowe funkcje jako dane wejściowe. Jest to sposób na wykonanie wielu obliczeń przy minimalnej liczbie wierszy kodu. Na przykład bsxfun
, który wykonuje operacje binarne element po elemencie, to znaczy: stosuje funkcję na dwóch wektorach lub macierzach w sposób element po elemencie. Zwykle wymagałoby to użycia pętli-pętli, co często wymaga wstępnej alokacji for
względu na szybkość. Przy użyciu bsxfun
ten proces jest przyspieszony. Poniższy przykład ilustruje to za pomocą tic
i toc
, dwóch funkcji, których można użyć do określenia czasu, jaki zajmuje kod. Oblicza różnicę każdego elementu macierzy na podstawie średniej kolumny macierzy.
A = rand(50); % 50-by-50 matrix of random values between 0 and 1
% method 1: slow and lots of lines of code
tic
meanA = mean(A); % mean of every matrix column: a row vector
% pre-allocate result for speed, remove this for even worse performance
result = zeros(size(A));
for j = 1:size(A,1)
result(j,:) = A(j,:) - meanA;
end
toc
clear result % make sure method 2 creates its own result
% method 2: fast and only one line of code
tic
result = bsxfun(@minus,A,mean(A));
toc
Uruchomienie powyższego przykładu daje dwa wyniki:
Elapsed time is 0.015153 seconds.
Elapsed time is 0.007884 seconds.
Linie te pochodzą z funkcji toc
, które drukują czas, jaki upłynął od ostatniego wywołania funkcji tic
.
Wywołanie bsxfun
stosuje funkcję z pierwszego argumentu wejściowego do pozostałych dwóch argumentów wejściowych. @minus
to długa nazwa dla tej samej operacji, co zrobiłby znak minus. Można określić inną anonimową funkcję lub uchwyt ( @
) niż jakakolwiek inna funkcja, o ile akceptuje ona A
i mean(A)
jako dane wejściowe w celu wygenerowania znaczącego wyniku.
Szczególnie w przypadku dużych ilości danych w dużych matrycach bsxfun
może bsxfun
przyspieszyć. Sprawia również, że kod wygląda na bardziej przejrzysty, chociaż interpretacja może być trudniejsza dla osób, które nie znają MATLAB ani bsxfun
. (Zauważ, że w MATLAB R2016a i późniejszych wiele operacji, które wcześniej korzystały z bsxfun
już ich nie potrzebują; A-mean(A)
działa bezpośrednio, a w niektórych przypadkach może być nawet szybszy.)