Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Previous revision Next revision | Previous revision Last revision Both sides next revision | ||
inner_product [2008/12/12 21:04] joanna |
inner_product [2008/12/12 21:41] joanna poprawka listy |
||
---|---|---|---|
Linia 15: | Linia 15: | ||
T inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, | T inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, | ||
T init, | T init, | ||
- | BinaryFunction1 binary_op1, BinaryFunction2 binary_op2); //wariant drugi | + | BinaryFunction1 binary_op1, BinaryFunction2 binary_op2); // wariant drugi |
</code> | </code> | ||
\\ | \\ | ||
- | =====Wariant pierwszy, loczyn skalarny euklidesowy===== | + | |
+ | =====Wariant pierwszy - iloczyn skalarny euklidesowy===== | ||
Prostsza z deklaracji ''inner_product'' udostępnia inerfejs do obliczenia zwykłego iloczynu skalarnego, znanego z geometrii euklidesowej. | Prostsza z deklaracji ''inner_product'' udostępnia inerfejs do obliczenia zwykłego iloczynu skalarnego, znanego z geometrii euklidesowej. | ||
===Parametery=== | ===Parametery=== | ||
- | * //first1// iterator, który wskazuje na początek kolekcji pierwszej\\ | + | * //first1// iterator, który wskazuje na początek kolekcji pierwszej\\ |
- | * //last1// iterator, który wskazuje na koniec kolekcji pierwszej\\ | + | * //last1// iterator, który wskazuje na koniec kolekcji pierwszej\\ |
- | * //first2// iterator, który wskazuje na początek kolekcji drugiej\\ | + | * //first2// iterator, który wskazuje na początek kolekcji drugiej\\ |
- | * //init// wartość początkowa wyniku\\ | + | * //init// wartość początkowa wyniku\\ |
===Działanie=== | ===Działanie=== | ||
- | Funkcja inicjalizuje akumulator //a// = //init//, po czym oblicza //a// = //a// + (*//it1//) * (*//it2//) dla podanego zekresu kolekcji . Iterator //it1// mieści się w zakresie [//first1//, //last1//) a it2 w zakresie [//first2//, //first// + //last1//-//first1//). Jeśli zakresy kolekcji nie są równe, do obliczeń brany jest krótszy zakres. Zwracany jest oczywiście wynik działania.\\ | + | Funkcja inicjalizuje akumulator //a// = //init//, po czym oblicza kolejno w podanych zakresach: //a// = //a// + (*//it1//) ⋅ (*//it2//) |
+ | gdzie //it1// ∈ [//first1//, //last1//) , //it2// ∈ [//first2//, //first2// + //last1//-//first1//).\\ | ||
+ | Jeśli zakresy kolekcji nie są równe, do obliczeń brany jest krótszy zakres. Zwracany jest oczywiście wynik działania. | ||
Funckja ''inner_product'' ma złożoność liniową. | Funckja ''inner_product'' ma złożoność liniową. | ||
Linia 51: | Linia 54: | ||
=====Wariant drugi - iloczyn skalarny zdefinowany przez użytkownika===== | =====Wariant drugi - iloczyn skalarny zdefinowany przez użytkownika===== | ||
- | Druga z deklaracji ''inner_product'' jest poszerzona o dwa parametry: | + | Druga z deklaracji ''inner_product'' jest poszerzona o dwa parametry:\\ |
- | * //binary_op1// operacja dwuargumentowa, która zastąpi dodawanie\\ | + | * //binary_op1// operacja dwuargumentowa, która zastąpi dodawanie\\ |
* //binary_op2// operacja dwuargumentowa, która zastąpi mnożenie\\ | * //binary_op2// operacja dwuargumentowa, która zastąpi mnożenie\\ | ||
===Działanie=== | ===Działanie=== | ||
- | Funkcja inicjalizuje akumulator //a// = //init//, po czym oblicza //a// = //binary_op1//(//a// , //binary_op2//( (*//it1//) ,(*//it2//))) dla podanego zekresu kolekcji . Zakresy iteratorów są takie same jak w pierwszym przypadku ''inner_product''. //binary_op1// i //binary_op2// muszą być funkcjami lub obiektami funkcyjnymi. | + | Funkcja inicjalizuje akumulator //a// = //init//, po czym oblicza //a// = //binary_op1//( //a// , //binary_op2//( (*//it1//) ,(*//it2//) ) ) dla podanego zekresu kolekcji. Zakresy iteratorów są takie same jak w pierwszym przypadku. \\ |
+ | //binary_op1// i //binary_op2// muszą być funkcjami lub obiektami funkcyjnymi. | ||
===Zdefiniowanie operacji do inner_product=== | ===Zdefiniowanie operacji do inner_product=== | ||
- | Aby wykorzystać ''inner_product'' do obliczania własnego iloczynu skalarnego należy zdefiniować własne operacje //binary_op1// i //binary_op2//. Najłatwiej to zrobić posługując się szablonem [[binary_operation]]. W przykładzie w pliku ''inner_product'' zdefiniowana jest funkcja multiplies_conj, która mnoży liczbę zespoloną [[ liczby zespolone <complex> | complex]] przez liczbę sprzężoną z drugą liczbą.\\ | + | Aby wykorzystać ''inner_product'' do obliczania własnego iloczynu skalarnego należy zdefiniować własne operacje //binary_op1// i //binary_op2//. Najłatwiej to zrobić posługując się szablonem [[binary_operation]]. W przykładzie w pliku {{stl_algorytmy:inner_product.cpp | inner_product.cpp}} zdefiniowana jest funkcja ''multiplies_conj'', która mnoży liczbę zespoloną [[ liczby zespolone <complex> | complex]] przez liczbę sprzężoną z drugą liczbą.\\ |
<code cpp> | <code cpp> | ||
#include <functional> // szablon binary_function | #include <functional> // szablon binary_function | ||
- | template<class _Tp> struct multiplies_conj: public binary_function<_Tp, _Tp, _Tp> { //oblicza specyficzne mnożenie dla liczb zespolonych | + | template<class _Tp> struct multiplies_conj: public binary_function<_Tp, _Tp, _Tp> {// oblicza specyficzne mnożenie dla liczb zespolonych |
- | _Tp operator()(const _Tp& __x, const _Tp& __y) const { //obiekt funkcyjny - przeciążony operator () | + | _Tp operator()(const _Tp& __x, const _Tp& __y) const { // obiekt funkcyjny - przeciążony operator () |
- | return __x * conj(__y); // własne działanie - tutaj conj - zwraca liczbę sprzężoną do __y | + | return __x * conj(__y); // własne działanie - tutaj conj - zwraca liczbę sprzężoną do __y |
} | } | ||
Linia 72: | Linia 76: | ||
</code> | </code> | ||
- | Wykorzystując operację multiplies_conj oraz operację plus (również pochodną [[binary_function]]) łatwo jest już zdefiniować iloczyn skalarny dla wektorów liczb zespolonych: | + | Wykorzystując operację ''multiplies_conj'' oraz operację ''plus'' (również pochodną [[binary_function]]) łatwo jest już zdefiniować iloczyn skalarny dla wektorów liczb zespolonych: |
<code cpp> | <code cpp> | ||
Linia 91: | Linia 95: | ||
// complex <= 0 + ( 1*(4-5j) + ( (3+2j)*(3+j) ) ) = 4 + 9 - 2 - 5j + 3j + 6j = 11 +4j | // complex <= 0 + ( 1*(4-5j) + ( (3+2j)*(3+j) ) ) = 4 + 9 - 2 - 5j + 3j + 6j = 11 +4j | ||
ComplexInt complexInner = inner_product(c1.begin(), c1.end(), c2.begin(), complexZero, | ComplexInt complexInner = inner_product(c1.begin(), c1.end(), c2.begin(), complexZero, | ||
- | plus<ComplexInt>(), multiplies_conj<ComplexInt>()); | + | plus<ComplexInt>(), multiplies_conj<ComplexInt>()); //zamiast zwykłego mnożenia - mnożenie przez liczbę sprzężoną |
- | cout<<"Iloczyn skalarny = "<<complexInner<<endl; //Iloczyn skalarny = (11,4) | + | cout<<"Iloczyn skalarny = "<<complexInner<<endl; //Iloczyn skalarny = (11,4) |
</code> | </code> | ||
====Zastosowanie inner_product==== | ====Zastosowanie inner_product==== | ||
Możliwych zastosowań ''inner_product'' można wymyśleć tyle, ile jest różnych przestrzeni z działaniem iloczynu skalarnego. Wiele problemów, niekoniecznie matematycznych, można wyrazić w postaci obliczania iloczynu skalarnego. Łatwo na przykład zastosować ten sposób obliczeń do porównywania ciągów znaków, do obliczania dopasowania do wzorca. Operacja iloczynu skalarnego jest dość prosta i szybka, dlatego warto z niej skorzystać w swoich projektach. | Możliwych zastosowań ''inner_product'' można wymyśleć tyle, ile jest różnych przestrzeni z działaniem iloczynu skalarnego. Wiele problemów, niekoniecznie matematycznych, można wyrazić w postaci obliczania iloczynu skalarnego. Łatwo na przykład zastosować ten sposób obliczeń do porównywania ciągów znaków, do obliczania dopasowania do wzorca. Operacja iloczynu skalarnego jest dość prosta i szybka, dlatego warto z niej skorzystać w swoich projektach. | ||
+ | |||
+ | ====Przykładowy kod==== | ||
+ | Fragmenty kodu użyte w artykule znajdują się w pliku {{stl_algorytmy:inner_product.cpp | inner_product.cpp}}. Tam też można znaleźć przykład, jak policzyć kąt pomiędzy wektorami przy pomocy funkcji ''inner_product''. | ||