2014-09-17 18 views
6

Mam macierz A o dowolnych wymiarach m x i chcę ją wypełnić za pomocą równania, na przykład dla każdego elementu a_ij z A, i = 1, ..., mi oraz j = 1, ..., n, chciałbym,Jak wypełnić macierz za pomocą równania w MATLAB?

a_ij = i^2 + j^2.

W Matlab wypełnione ręcznie wydaje się, podobny do tego,

A = [1^2+1^2, 1^2+2^2, ..., 1^2+j^2, ..., 1^2+n^2; 
    2^2+1^2, 2^2+2^2, ..., 2^2+j^2, ..., 2^2+n^2; 

    . 
    . 
    . 

    i^2+1^2, i^2+2^2, ..., i^2+j^2, ..., i^2+n^2; 

    .          
    . 
    . 

    m^2+1^2, m^2+2^2, ..., m^2+j^2, ..., m^2+n^2] 

a więc pierwsze kilka terminów byłoby:

[2, 5, 10,17,... 

5, 8, 13,20,... 

10,13,18,25,... 

17,20,25,32,... 
] 
+1

Obaj pracowali świetnie. Dziękuję wam wszystkim. Przykro mi, jestem nowy w MATLAB i na tym forum. Myślałem, że ustawiłem powiadomienie e-mailem, aby wiedzieć, że pytanie zostało zadane, najwyraźniej nie. – josh

Odpowiedz

4

Alternatywą korzystania ndgrid:

[I, J] = ndgrid(1:m, 1:n); 
A = I.^2 + J.^2; 
+1

Równa się: 'A = ndgrid (1: n, 1: m) '.^2 + ndgrid (1: m, 1: n).^2' –

+2

@ A.Klomp Uzgodnione, ale trudniej jest odczytać i prawdopodobnie być mniej wydajnym niż rozwiązanie "bsxfun". – Dan

+1

Całkowicie się zgadzam. Prawdopodobnie wolniej niż wcześniejsza wersja ndgrid, biorąc pod uwagę, że wywołuje ją dwukrotnie. –

8

bsxfun rozwiązanie oparte -

A = bsxfun(@plus,[1:m]'.^2,[1:n].^2) 

bsxfun wykonuje array expansion na singleton dimensions (tj. wymiary z liczbą elementów równą 1) i wykonuje jeden z pierwszych argumentów wywołania elementwise operation specified by the function handle .

Więc na naszym przypadku, jeśli używamy column vector (mx1) i row vector (1xn), następnie z wymienionych kodu bsxfun, zarówno tych wektorów rozwinie jak 2D matrices i będzie wykonywać elementwise summation of elements (ze względu na rączce Funkcja - @plus), dając nam żądane wyjście 2D. Wszystkie te kroki są wykonywane wewnętrznie przez MATLAB.

Uwaga: Ta wydajność musi być dość wydajna, a wydajność bsxfun jest odpowiednia dla tych problemów związanych z tą samą definicją, co opisano wcześniej.

+2

[tag: bsxfun] to tyle zabawy! – Shai

+0

Dziękuję za odpowiedź. Jest to miłe, przyjemne sformułowanie, ale tak naprawdę nie rozumiem, co to równanie/funkcja oznacza lub mówi Matlabowi. Co to jest @plus? – josh

+1

@josh Sprawdź, czy zmiany mają trochę więcej sensu? 'bsxfun' zajmuje trochę czasu, aby się zawiesić, ale opłaca się poprawić wydajność kodow wektorowych. – Divakar

Powiązane problemy