Matrix dimensions must agree

Matrix dimensions must agree

W ostatniej wersji MATLABa wprowadzono zmiany, które sprawiają, że tytułowy komunikat pojawiać się będzie rzadziej. Wszystko za sprawą nowych zasad jakie obowiązują przy operacjach na macierzach.

W zasadzie nie chodzi tu o operacje macierzowe a tablicowe. Drobny niuans, który nie dla każdego jest zrozumiały, w związku z czym parę słów wyjaśnienia.

Operacje macierzowe

O operacjach macierzowych mówimy wtedy, gdy na macierzach operujemy tak jak  na zajęciach z matematyki przykazano. Możemy przemnożyć macierz przez inną macierz po warunkiem, że kolumn w tej pierwszej macierzy jest tyle, ile wierszy w drugiej. Można również dodawać macierze i je odejmować. "Dzielić" też, choć to już osobna historia.

Operacje tablicowe

O operacjach tablicowych mówimy wtedy, gdy macierz traktujemy jako zbiór niezależnych elementów. Jeśli chcemy przemnożyć przez siebie dwie tablice, to oznacza, że chcemy przemnożyć każdy element jednej tablicy przez odpowiadający mu element drugiej tablicy. W przypadku tablicowej operacji iloczynu rozmiar przemnażanych macierzy musi być identyczny. Chęć wykonania w MATLABie operacji mnożenia tablicowego sygnalizujemy stawiając kropkę przed operatorem.

C = A .* B

Co nowego?

Obecnie możliwe jest wykonywanie "dodawania tablicowego". Gdy w MATLABie dodamy do macierzy 2D wektor, MATLAB doda pojedynczy element wektora do wszystkich odpowiadających mu elementów wiersza lub kolumny macierzy. Zrozumiałe? Pewnie nie, ale przykład wszystko wyjaśni.

Typowy problem: Od kilku niezależnych przebiegów czasowych, które mamy zebrane w jednej tablicy, należy odjąć wartość średnią (dla każdego przebiegu jest ona oczywiście inna).

Do tej pory procedura wyglądała mniej więcej tak:

A = rand(10,3) % tablica z danymi
m = mean(A);
M = repmat(m, size(A,1), 1); % wykonanie tablicy z kopiami wartości średnich w każdym wierszu
B = A - M;

Lub tak, dla nieco bardziej wtajemniczonych:

A = rand(10,3) % tablica z danymi
m = mean(A);
B = bsxfun(@minus, A, m);

Teraz, operacja może wyglądać tak:

A = rand(10,3) % tablica z danymi
m = mean(A);
B = A - m;

MATLAB nie będzie się burzył, że rozmiary tablicy A i m nie przystają.  Moim zdaniem sprawia to, że jest dużo czytelniej.

Jedna myśl nt. „Matrix dimensions must agree”

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *