# komórka (cell) zawierająca liczbę calkowitą 42
a = { 42 }
# komórka (cell) zawierająca znak 'A'
b = { 'A' }
# komórka z napisem
c = { 'Siała baba mak' }
whos a b c
a =
{
[1,1] = 42
}
b =
{
[1,1] = A
}
c =
{
[1,1] = Siała baba mak
}
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
a 1x1 8 cell
b 1x1 1 cell
c 1x1 15 cell
Total is 3 elements using 24 bytes
# wektor komórkowey wierszowy
c = { 42, 'A', 1:3:10, 'Witaj'}
whos c
c =
{
[1,1] = 42
[1,2] = A
[1,3] =
1 4 7 10
[1,4] = Witaj
}
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
c 1x4 38 cell
Total is 4 elements using 38 bytes
# wektor kolumnowy
c = { 42; 'A'; 1:3:10; 'Witaj'}
size(c)
c =
{
[1,1] = 42
[2,1] = A
[3,1] =
1 4 7 10
[4,1] = Witaj
}
ans =
4 1
# macierz komórkowa 2x2
c = { 42, 'A'; 1:3:10, 'Witaj'}
size(c)
c =
{
[1,1] = 42
[2,1] =
1 4 7 10
[1,2] = A
[2,2] = Witaj
}
ans =
2 2
# elementami macierzy komórkowej moga być macierze komórkowe
d = { c , c ; 1, 'A'}
whos d
d =
{
[1,1] =
{
[1,1] = 42
[2,1] =
1 4 7 10
[1,2] = A
[2,2] = Witaj
}
[2,1] = 1
[1,2] =
{
[1,1] = 42
[2,1] =
1 4 7 10
[1,2] = A
[2,2] = Witaj
}
[2,2] = A
}
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
d 2x2 85 cell
Total is 4 elements using 85 bytes
cell(N, M) tworzy pustą macierz komórkową o wymiarach NxM## pusta macierz - prealikacja macierzy komórkowej x = cell(2, 3) whos x
x =
{
[1,1] = [](0x0)
[2,1] = [](0x0)
[1,2] = [](0x0)
[2,2] = [](0x0)
[1,3] = [](0x0)
[2,3] = [](0x0)
}
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
x 2x3 0 cell
Total is 6 elements using 0 bytes
# ewentualnie można utworzyć macierz inicjując jej najdalszy element
y{2,3} = []
y =
{
[1,1] = [](0x0)
[2,1] = [](0x0)
[1,2] = [](0x0)
[2,2] = [](0x0)
[1,3] = [](0x0)
[2,3] = [](0x0)
}
Ćwiczenie: utwórz macierz komórkową o wymiarach 2×3 zawierającą 6 nastepujących elementów: * dzisiejsza data (zob. polecenie data) * tablica 2-elementowa zawierająca aktualną godzinę i minutę (zob. polecenie clock) * macierz jednostkowa o wymiarach 10×10 * napis “Witaj Świcie” * wektor wierszowy zawierający liczby calkowite od 1 do 100 * wektor 6 losowych liczb całkowitych z puli od 1 do 49 (wyniki losowanoa lotto) w kolejnosci rosnącej (zob. funkcję randi)
{i, j} dają dostęp do wartości umieszczonych w komórkach(i, j) dają dostęp do komórek (wynik jest obiektem typu cell)x = { 42, 'A'; 1:3:10, 'Witaj'};
% indeksowanie wartości (1,1)
a = x{1,1}
% indeksowanie komórek
b = x(1,1)
whos a b
a = 42
b =
{
[1,1] = 42
}
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
a 1x1 8 double
b 1x1 8 cell
Total is 2 elements using 16 bytes
x = { 42, 'A'; 1:3:10, 'Witaj'};
% elementem {2,1} jest wektor
a = x{2,1}
% element 1 wektora z komórki x{2,1}
c = x{2, 1}(1)
a =
1 4 7 10
c = 1
% elementem (2,1) jest komórka zawierająca wektor
b = x(2, 1)
% element 1 wektora znajdującago się w pierwszej komórce znajdującej się w x(2,1)
d = x(2, 1){1}(1)
whos a b c d
b =
{
[1,1] =
1 4 7 10
}
d = 1
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
a 1x4 24 double
b 1x1 24 cell
c 1x1 8 double
d 1x1 8 double
Total is 7 elements using 64 bytes
x = { 42, 'A', 1:3:10, 'Matlab'};
# pierwsze 3 elementy - 3 różne zmienne ans
x{1:3}
ans = 42
ans = A
ans =
1 4 7 10
% wynik można podstawić do 3 róznych zmiennych
[a b c] = x{1:3}
whos a b c
a = 42
b = A
c =
1 4 7 10
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
a 1x1 8 double
b 1x1 1 char
c 1x4 24 double
Total is 6 elements using 33 bytes
% wynikiem x(1:3) nowa macierz komórkowa x(1:3) % wynikiem jest jedna zmienna a = x(1:3) whos a x
ans =
{
[1,1] = 42
[1,2] = A
[1,3] =
1 4 7 10
}
a =
{
[1,1] = 42
[1,2] = A
[1,3] =
1 4 7 10
}
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
a 1x3 33 cell
x 1x4 39 cell
Total is 7 elements using 72 bytes
% indeksowanie podobne jak w macierzach
x = { 42, 'A'; 1:3:10, 'Matlab'};
% pierwsza kolumna
a = x(1, :)
% ostatni wiersz
b = x(end, :)
a =
{
[1,1] = 42
[1,2] = A
}
b =
{
[1,1] =
1 4 7 10
[1,2] = Matlab
}
celldisp() wypisuje zawartość kolejnych komórekcellplot() wypisanie wartości w trybie graficznym (w oknie), brak w Octavex = { 42, 'A'; 1:3:10, 'Matlab'};
disp(x)
celldisp(x)
{
[1,1] = 42
[2,1] =
1 4 7 10
[1,2] = A
[2,2] = Matlab
}
x{1,1} =
42
x{2,1} =
1 4 7 10
x{1,2} =
A
x{2,2} =
Matlab
% wyświetlanie rekurencyjne macierzy komórkowych zawierających inne macierze komórkowe
y = {1, 2, x}
celldisp(y)
y =
{
[1,1] = 1
[1,2] = 2
[1,3] =
{
[1,1] = 42
[2,1] =
1 4 7 10
[1,2] = A
[2,2] = Matlab
}
}
y{1} =
1
y{2} =
2
y{3}{1,1} =
42
y{3}{2,1} =
1 4 7 10
y{3}{1,2} =
A
y{3}{2,2} =
Matlab
% celplot() nie jest dostępne w Octave cellplot(x)
warning: the 'cellplot' function is not yet implemented in Octave Please read <https://www.octave.org/missing.html> to learn how you can contribute missing functionality. error: 'cellplot' undefined near line 2 column 1
reshape, transpozycja)iscell() spradza, czy zmienna jest typu cellx = { 42, 'A'; 1:3:10, 'Matlab'};
% rozmiar
[w k] = size(x)
% transpozycja
y = x'
w = 2
k = 2
y =
{
[1,1] = 42
[2,1] = A
[1,2] =
1 4 7 10
[2,2] = Matlab
}
% zmiana kształtu reshape(x, [1, 4]) % usuwanie elementów x(1, :) = []
ans =
{
[1,1] = 42
[1,2] =
1 4 7 10
[1,3] = A
[1,4] = Matlab
}
x =
{
[1,1] =
1 4 7 10
[1,2] = Matlab
}
tekst = {'Ala ma kota', 'Siała baba mak', 'Matlab'}
tekst =
{
[1,1] = Ala ma kota
[1,2] = Siała baba mak
[1,3] = Matlab
}
cellstr() zamiana tablicy znakowej na znakową macierz komórkową. Wypełniające blanki zostają usunięte.char() zamiana macierzy komórkowej na znakowąiscellstr() sprawdza, czy macierz jest macierzą komórkową z napisamix = char('Ala', 'Ewa', 'Zenon')
% utowrzenie macierzy komorkowej znakowej (3 napisy)
y = cellstr(x)
whos x y
x =
Ala
Ewa
Zenon
y =
{
[1,1] = Ala
[2,1] = Ewa
[3,1] = Zenon
}
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
x 3x5 15 char
y 3x1 11 cell
Total is 18 elements using 26 bytes
disp(y{1}) % napis 'Ala'
a = length(y{1})
disp(x(1, :)) % napis 'Ala ' (2 spacje na koncu)
b = length(x(1, :))
Ala a = 3 Ala b = 5
tekst = {'Ala', 'Ewa', 'Zenon'};
% utworzenie macierzy znakowaej 3x5
x = char(tekst)
whos x
x =
Ala
Ewa
Zenon
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
x 3x5 15 char
Total is 15 elements using 15 bytes
tekst = {'raz', 'dwa', 'trzy', 'cztery'};
s = char(tekst);
whos tekst s
% czy macierz komórkowa znakowa ?
a = iscellstr(tekst)
b = iscellstr(s)
c = iscellstr({1 , 'A', 'Ala'})
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
tekst 1x4 16 cell
s 4x6 24 char
Total is 28 elements using 40 bytes
a = 1
b = 0
c = 0
Ćwiczenie: utwórz tablicę komórkową zawierająca listę imion (np. Ala, Ewa, Janek), drugą zawierająca listę czasowników (np. lubi, je, czyta) i trzecia zawierającą rzeczowniki (np. kamienie, kotlety, koty). Napisz wyrażenie (lub funkcję), które tworzy zdania losując po jednym wyrazie z każdego zbioru (np. Ala lubi koty)
struktura.pole dostęp do pól struktury uzyskujemy za pomocą kropkistruct() pozwala tworzyć struktury. Argumentami funkcji są kolejne pary określające nazwę pola i wartość
struct(nazwa1, wartosc1, nazwa2, wartość2, ...)
# utowrzenie struktury za pomoca przypisania wartości s1.liczba = 42 s1.nazwa = 'Matlab' s1.macierz = rand([2,3])
s1 =
scalar structure containing the fields:
liczba = 42
s1 =
scalar structure containing the fields:
liczba = 42
nazwa = Matlab
s1 =
scalar structure containing the fields:
liczba = 42
nazwa = Matlab
macierz =
0.90546 0.84410 0.50294
0.29388 0.36011 0.69174
# utowrzenie struktury za pomoca funkcji struct()
s2 = struct('liczba', 42, 'nazwa', 'Matlab', 'macierz', rand([2,3]))
whos s1 s2 % ta struktura jest macierza 1x1
s2 =
scalar structure containing the fields:
liczba = 42
nazwa = Matlab
macierz =
0.241836 0.230792 0.186499
0.099092 0.119201 0.122511
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
s1 1x1 62 struct
s2 1x1 62 struct
Total is 2 elements using 124 bytes
rmfield(s, n) usuwa ze sruktury s pole o nazwie nisstruct(s) spradza, czy s jest strukturąisfield(s, n) sprawdza, czy pole o nazwie n znajduje się w strukturze sfieldnames(s) zwraca listę (cell array) nazw póls = struct('liczba', 42, 'nazwa', 'Matlab', 'macierz', rand(5));
disp(s)
% nazwy pól struktury
nazwy = fieldnames(s)
scalar structure containing the fields:
liczba = 42
nazwa = Matlab
macierz =
0.038913 0.317290 0.831178 0.354825 0.522132
0.736033 0.781280 0.281603 0.907320 0.272378
0.244622 0.653326 0.608465 0.268054 0.593301
0.818070 0.741613 0.449265 0.981028 0.870832
0.224464 0.475633 0.370601 0.401830 0.257715
nazwy =
{
[1,1] = liczba
[2,1] = nazwa
[3,1] = macierz
}
% nie modyfikuje struktury ale zwraca kopię rmfield(s, 'macierz') % aktualna zawartość struktury disp(s)
ans =
scalar structure containing the fields:
liczba = 42
nazwa = Matlab
scalar structure containing the fields:
liczba = 42
nazwa = Matlab
macierz =
0.038913 0.317290 0.831178 0.354825 0.522132
0.736033 0.781280 0.281603 0.907320 0.272378
0.244622 0.653326 0.608465 0.268054 0.593301
0.818070 0.741613 0.449265 0.981028 0.870832
0.224464 0.475633 0.370601 0.401830 0.257715
% podstawiamy wynik aby zachować zmiany s = rmfield(s, 'macierz') disp(s)
s =
scalar structure containing the fields:
liczba = 42
nazwa = Matlab
scalar structure containing the fields:
liczba = 42
nazwa = Matlab
% czy struktura zawiera pole o danej nazwie? a = isfield(s, 'liczba') b = isfield(s, 'xxx')
a = 1 b = 0
Do pól struktury możemy odnosić się również używając nazw pól w postaci łańcuchów znakowych
s = struct('liczba', 42, 'nazwa', 'Matlab', 'macierz', rand(5));
% pole o nazwie 'liczba'
a = s.('liczba')
t = 'nazwa'
% nazwa pola zawarta w zmiennej
b = s.(t)
n = fieldnames(s);
for i=1:length(n)
fprintf('\nPole o nazwie %s\n', n{i})
disp(s.(n{i}))
end
a = 42 t = nazwa b = Matlab Pole o nazwie liczba 42 Pole o nazwie nazwa Matlab Pole o nazwie macierz 0.912414 0.920362 0.263780 0.128573 0.340286 0.663009 0.914018 0.881667 0.286782 0.813027 0.648888 0.489993 0.766774 0.403041 0.284646 0.651711 0.414582 0.074597 0.489842 0.120202 0.136358 0.300551 0.394563 0.728933 0.287581
repmat pozwala utowrzyć macierz z kopiami strukturysm(1).pole = 5 sm(2).pole = 42 whos sm
sm =
scalar structure containing the fields:
pole = 5
sm =
1x2 struct array containing the fields:
pole
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
sm 1x2 16 struct
Total is 2 elements using 16 bytes
# prealokacja macierzy strukrur przez zdefiniowanie ostatniego elementu sa(10).pole = 3 whos sa disp(sa)
sa =
1x10 struct array containing the fields:
pole
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
sa 1x10 8 struct
Total is 10 elements using 8 bytes
1x10 struct array containing the fields:
pole
% macierz 10x10 pustych elementów (tylko sb(10,10) jest strukturą z wartością pola 5 ) sb(10,10).pole = 5 whos sb disp(sb) sb(1,1) sb(10,10)
sb =
10x10 struct array containing the fields:
pole
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
sb 10x10 8 struct
Total is 100 elements using 8 bytes
10x10 struct array containing the fields:
pole
ans =
scalar structure containing the fields:
pole = [](0x0)
ans =
scalar structure containing the fields:
pole = 5
% alokacja macierzy struktur za pomocą funkcji repmat
s3 = repmat(struct('pole', 42, 'nazwa', 'Matlab'), 2, 3)
whos s3
disp(s3)
a = s3(1, 2).pole
s3.pole
whos a
s3 =
2x3 struct array containing the fields:
pole
nazwa
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
s3 2x3 84 struct
Total is 6 elements using 84 bytes
2x3 struct array containing the fields:
pole
nazwa
a = 42
ans = 42
ans = 42
ans = 42
ans = 42
ans = 42
ans = 42
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
a 1x1 8 double
Total is 1 element using 8 bytes
Elementy pól wybranych struktur mogą być uzyte do utworzenia macierzy z tymi elementami
% umieszczenie wartości pól struktury w wektorze a = [ s3.pole ] whos a size(a)
a =
42 42 42 42 42 42
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
a 1x6 48 double
Total is 6 elements using 48 bytes
ans =
1 6
st = struct('pole1', struct('a', 13, 'b', 14), 'pole2', struct('x', -1))
disp(st)
% pole 1 jest strukturą
a = st.pole1
% struktura w polu1 ma pole 'a'
b = st.pole1.a
st =
scalar structure containing the fields:
pole1 =
scalar structure containing the fields:
a = 13
b = 14
pole2 =
scalar structure containing the fields:
x = -1
scalar structure containing the fields:
pole1 =
scalar structure containing the fields:
a = 13
b = 14
pole2 =
scalar structure containing the fields:
x = -1
a =
scalar structure containing the fields:
a = 13
b = 14
b = 13
Ćwiczenie zaprojektuj i utwórz strukturę, która będzie przechowywała dane dotyczące studenta, takie jak: imię, nazwisko, data urodzenia (data jest też strukturą zawierającą pola: dzień, miesiąc, rok), miejsce zamieszkania (adres zawiera pola: ulica, numer domu, kod pocztowy, kraj). Wprowadź przykładowe dane do struktury.
Utwórz macierz 100×100 zawierającą kopie tej struktury w każdym elemencie.
cell2struct() zamiana macierzy komórkowej na strukturęstruct2cell() zamiana struktury na macierz komórkowąc = {'A', 1, 'Ala', [12,3]};
% utworzenie struktury z nazwami pól 'a', 'b', 'c', 'd'
d = cell2struct(c, {'a', 'b', 'c', 'd'}, 2)
disp(d)
whos c d
d =
scalar structure containing the fields:
a = A
b = 1
c = Ala
d =
12 3
scalar structure containing the fields:
a = A
b = 1
c = Ala
d =
12 3
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
c 1x4 28 cell
d 1x1 28 struct
Total is 5 elements using 56 bytes
% utworzenie macierzy komórkowej ze struktury e = struct2cell(d) disp(e) whos e
e =
{
[1,1] = A
[2,1] = 1
[3,1] = Ala
[4,1] =
12 3
}
{
[1,1] = A
[2,1] = 1
[3,1] = Ala
[4,1] =
12 3
}
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
e 4x1 28 cell
Total is 4 elements using 28 bytes
Stwórz plik o nazwie licz_znaki.m a w nim zdefiniuj funkcję o nazwe licz_znaki(), która dla podanego w argumencie napisu zwraca strukturę zawierającą nastepujące pola:
znaki zawiera ilość znaków w napisielitery zawiera ilość liter (małych i duzych) w napisiewyrazy zawiera ilość wyrazów w napisie (wyrazem jest dowolny ciąg znaków oddzielonych przynajmniej jedną spacją)Argumentem funkcji może być napis lub tablica komórkowa z napisami. Jeżeli argumentem jest pojedynczy napis to wynikiem jest pojedyncza struktura. Jeżeli argumentem jest tablica komórkowa znakowa to wynikiem jest macierz struktur o takim samym wymiarze jak tablica komórkowa dana w argumencie. Każdy element macierzy wynikowej zlicza wówczas znaki odpowiadającego elementowi macierzy komórkowej (zobacz przykład niżej) W przypadku, gdy funkcja zostanie uruchomiona z argumentami innego typu lub w przypadku gdy uzytkonik poda niepoprawną ilość argumentów (różną od 1) to wypisywany jest stosowny komunikat błedu i program się kończy.
Przykład
Uruchomienie funkcji
x = licz_znaki('Ala ma kota')
zwróci strukturę zawierającą wartości:
x.znaki = 11 x.litery = 9 x.wyrazy = 3
Gdy argumentem będzie macierz komórkowa z napisami to wynikiem bedzie macierz struktur, np.:
a = { 'Ala ma kota', 'Matlab'};
x = licz_znaki(a)
utowrzy zmienną x, która jest macierzą 1×2
x(1,1).znaki = 11 x(1,1).litery = 9 x(1,1).wyrazy = 3 x(1,2).znaki = 6 x(1,2).litery = 6 x(1,2).wyrazy = 1