C++에서 두 벡터의 내적 계산
-
std::inner_product
를 사용하여 C++에서 두 벡터의 내적 계산 -
std::transform_reduce
를 사용하여 C++에서 두 벡터의 내적 계산 -
std::transform_reduce
및std::execution::par
사용 두 벡터의 내적 계산
이 기사에서는 C++에서 두 벡터의 내적을 계산하는 여러 방법을 보여줍니다.
내적은 두 벡터의 해당 요소의 곱의 합입니다. 두 개의 벡터-{1, 2, 3}
및{4, 5, 6}
이 있고이 벡터의 내적은1*4 + 2*5 + 3*6 = 32
라고 가정합니다.
std::inner_product
를 사용하여 C++에서 두 벡터의 내적 계산
std::inner_product
는<numeric>
헤더에 포함 된 C++ 숫자 알고리즘 라이브러리의 일부입니다. 이 메서드는 두 범위에서 제품의 합계를 계산합니다. 첫 번째는 begin
/end
반복자로 지정되고 두 번째 범위는 begin
으로 만 지정됩니다. 이 함수는 누산기 값을 초기화하기 위해 네 번째 매개 변수로init
를 사용합니다. 반환 값은 주어진 범위의 최종 내적 값입니다. std::inner_product
는 항상 주어진 순서대로 작업을 수행합니다.
#include <iostream>
#include <iterator>
#include <numeric>
#include <vector>
using std::copy;
using std::cout;
using std::endl;
using std::vector;
int main() {
vector<int> vec1{1, 2, 3, 4, 5};
vector<int> vec2{2, 4, 6, 8, 10};
copy(vec1.begin(), vec1.end(), std::ostream_iterator<int>(cout, "; "));
cout << endl;
copy(vec2.begin(), vec2.end(), std::ostream_iterator<int>(cout, "; "));
cout << endl;
cout << "Scalar product is: "
<< inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
cout << endl;
return EXIT_SUCCESS;
}
출력:
1; 2; 3; 4; 5;
2; 4; 6; 8; 10;
Scalar product is: 110
std::transform_reduce
를 사용하여 C++에서 두 벡터의 내적 계산
이전 방법과 달리std::transform_reduce
는 순서가 맞지 않는 범위에서 작업을 수행 할 수 있으므로 성능을 극대화 할 수 있습니다. std::transform_reduce
는 본질적으로std::inner_product
알고리즘의 병렬화 된 버전입니다. 다음 예제는 이전 예제에서 전달 된 것과 동일한 인수를 사용하여 함수의 실행을 보여줍니다.
#include <iostream>
#include <iterator>
#include <numeric>
#include <vector>
using std::copy;
using std::cout;
using std::endl;
using std::inner_product;
using std::vector;
int main() {
vector<int> vec1{1, 2, 3, 4, 5};
vector<int> vec2{2, 4, 6, 8, 10};
copy(vec1.begin(), vec1.end(), std::ostream_iterator<int>(cout, "; "));
cout << endl;
copy(vec2.begin(), vec2.end(), std::ostream_iterator<int>(cout, "; "));
cout << endl;
cout << "Scalar product is: "
<< std::transform_reduce(vec1.begin(), vec1.end(), vec2.begin(), 0);
return EXIT_SUCCESS;
}
출력:
1; 2; 3; 4; 5;
2; 4; 6; 8; 10;
Scalar product is: 110
std::transform_reduce
및std::execution::par
사용 두 벡터의 내적 계산
또는std::transform_reduce
알고리즘에 대한 실행 정책을 추가로 지정할 수 있습니다. 이 방법은이 매뉴얼에 정의 된 실행 규칙으로 프로그램 흐름을 사용자 지정할 수 있으므로 프로그래머에게 더 많은 제어를 제공합니다. transform_reduce
를 사용하면 성능이 향상되지만 병렬 실행 정책을 지정할 때 항상 잠재적 경쟁 조건을 염두에 두어야합니다.
#include <execution>
#include <iostream>
#include <iterator>
#include <numeric>
#include <vector>
using std::copy;
using std::cout;
using std::endl;
using std::inner_product;
using std::vector;
int main() {
vector<int> vec1{1, 2, 3, 4, 5};
vector<int> vec2{2, 4, 6, 8, 10};
copy(vec1.begin(), vec1.end(), std::ostream_iterator<int>(cout, "; "));
cout << endl;
copy(vec2.begin(), vec2.end(), std::ostream_iterator<int>(cout, "; "));
cout << endl;
cout << "Scalar product is: "
<< std::transform_reduce(std::execution::par, vec1.begin(), vec1.end(),
vec2.begin(), 0);
return EXIT_SUCCESS;
}
출력:
1; 2; 3; 4; 5;
2; 4; 6; 8; 10;
Scalar product is: 110
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook