在Matlab中,我们可以获得最大值,最小值以及复数矢量的位置:
[mag_x idx_x] = max(abs(X));
[mag_y idx_y] = max(abs(Y));
我知道我们可以用C ++做类似的事情,因为Matlab是从C ++构建的。但是我无法弄清楚。我也有不完整的代码,并且仍在处理:
#include <iostream> // std::cout
#include <algorithm> // std::min_element, std::max_element
#include <vector>
#include <complex>
#include <iostream>
int main()
{
//typedef std::complex < double > C
vector <complex<short> > vec;
vec.push_back ( complex <short> (1,1));
vec.push_back ( complex <short> (1,2));
vec.push_back ( complex <short> (3,4));
vec.push_back ( complex <short> (0,0));
vec.push_back ( complex <short> (4,8));
vec.push_back ( complex <short> (0,0));
vec.push_back ( complex <short> (2,3));
vec.push_back ( complex <short> (1,1));
int size = sizeof(x_vec)/sizeof(x_vec[0]);
for(int i =0; i < size; i++)
{
cout << x_vec[i] << endl;
}
...
return 0;
}
我还将通过以下链接查看示例代码:http : //www.cplusplus.com/reference/algorithm/max_element/,但它仅对矢量有效。
另外,当我计算时,size = sizeof(x_vec)/sizeof(x_vec[0]);
我期望大小= 8(因为上面有8个矢量复数),但我只给了大小= 6。
要vector<complex>
与一起使用std::max_element
,您需要提供一个比较两个complex
对象的值的函数。您需要执行此操作,因为有多种方法可以对其进行比较。
一种方法是编写一个Lambda函数,complex
使用来比较两个es std::abs
。您可以在对以下内容的调用中写成max_element
:
// C++14
auto maxelem = max_element(vec.begin(), vec.end(),
[](auto a, auto b) { return abs(a) < abs(b); });
// C++11
auto maxelem = max_element(vec.begin(), vec.end(),
[](const complex<short>& a, const complex<short>& b)
{ return abs(a) < abs(b); });
cout << "Max: " << *maxelem << endl;
max_element
产生一个包含找到的最大值的迭代器。可以在向量中找到该迭代器的索引std::distance
:
cout << "Max position: " << std::distance(vec.begin(), maxelem) << endl;
的complex
比较器功能可以被存储在auto
用于再使用:
// C++14
auto absLess = [](auto a, auto b) { return abs(a) < abs(b); };
// C++11
auto csAbsLess = [](const complex<short> &a,
const complex<short> &b) { return abs(a) < abs(b); };
我们可以将其与其他各种标准库算法(例如min_element
和)一起使用sort
。
auto maxelem = max_element(vec.begin(), vec.end(), absLess);
cout << "Max: " << *maxelem << endl;
cout << "Max position: " << std::distance(vec.begin(), maxelem) << endl;
auto minelem = min_element(vec.begin(), vec.end(), absLess);
cout << "Min: " << *minelem << endl;
cout << "Min position: " << std::distance(vec.begin(), minelem) << endl;
sort(vec.begin(), vec.end(), absLess);
for (const auto &c : vec) {
cout << c << endl;
}
输出:
Max: (4,8)
Max position: 4
Min: (0,0)
Min position: 3
(0,0)
(0,0)
(1,1)
(1,1)
(1,2)
(2,3)
(3,4)
(4,8)
当然,它不如雄辩[mag_x idx_x] = max(abs(X));
!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句