Narzędzia użytkownika

Narzędzia witryny


inner_product

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Previous revision
Next revision
Previous revision
inner_product [2008/12/12 21:13]
joanna
inner_product [2008/12/12 21:42] (aktualna)
joanna poprawka listy
Linia 19: Linia 19:
 \\ \\
  
-=====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 kolejno w podanych zakresach:\\ +Funkcja inicjalizuje akumulator //a// = //init//, po czym oblicza kolejno w podanych zakresach: //a// = //a// + (*//it1//) ⋅ (*//​it2//​) ​  
-   //a// = //a// + (*//it1//) ⋅ (*//​it2//​) ​\\  +gdzie //it1// ∈ [//​first1//,​ //​last1//​) ​,  ​//it2// ∈ [//​first2//,​ //first2// + //​last1//​-//​first1//​).\\ 
-   ​//it1// ∈ [//​first1//,​ //last1//)\\ +Jeśli zakresy kolekcji nie są równe, do obliczeń brany jest krótszy zakres. Zwracany jest oczywiście wynik działania.
-   //it2// ∈ [//​first2//,​ //first// + //​last1//​-//​first1//​)\\ +
-Jeśli zakresy kolekcji nie są równe, do obliczeń brany jest krótszy zakres. Zwracany jest oczywiście wynik \\a\\+
 Funckja ''​inner_product''​ ma złożoność liniową. Funckja ''​inner_product''​ ma złożoność liniową.
  
Linia 56: 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 77: 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 96: 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''​. ​
  
inner_product.1229112811.txt.gz · ostatnio zmienione: 2008/12/12 21:13 przez joanna