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:15]
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: //a// = //a// + (*//it1//) ⋅ (*//​it2//​) ​\\  +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//​)\\+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. 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 54: 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 75: 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 94: 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.1229112959.txt.gz · ostatnio zmienione: 2008/12/12 21:15 przez joanna