簡體   English   中英

如何在C ++中獲得向量復數值的最大值,最小值和位置?

[英]how can I get maximum , minimum, and position of the vector complex value in C++?

在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]); 我期望size = 8(因為上面有8個向量復數),但是我只給了size = 6。

要將vector<complex>std::max_element ,您需要提供一個用於比較兩個complex對象的值的函數。 您需要執行此操作,因為有多種方法可以進行比較。

一種方法是編寫一個lambda函數,該函數使用std::abs比較兩個complex es。 您可以在對max_element的調用中編寫以下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_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));那樣雄辯[mag_x idx_x] = max(abs(X));

在線演示在此處的Wandbox上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM