gpt4 book ai didi

c++ - 如何在 C++ 中获取 vector 复数值的最大值、最小值和位置?

转载 作者:搜寻专家 更新时间:2023-10-31 00:55:50 26 4
gpt4 key购买 nike

在Matlab中,我们可以得到复数 vector 的最大值、最小值以及位置:

[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/但它仅适用于 vector 。

此外,当我计算 size = sizeof(x_vec)/sizeof(x_vec[0]); 我期望 size = 8(因为上面有 8 个 vector 复数)但我只给了我 size = 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 找到该迭代器在 vector 中的索引。 :

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_elementsort .

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)); 那样 Eloquent !

An online demonstration is on Wandbox here.

关于c++ - 如何在 C++ 中获取 vector 复数值的最大值、最小值和位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41110906/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com