2016-12-12 2 views
2

In Matlab, können wir den max, min, und auch die Position des komplexen Vektors erhalten:Wie kann ich Maximum, Minimum und Position des Vektorkomplexwerts in C++ erhalten?

[mag_x idx_x] = max(abs(X)); 
[mag_y idx_y] = max(abs(Y)); 

Ich weiß, dass wir die ähnliche mit C++ tun können, weil Matlab baut von C++ ist. Aber ich konnte es nicht herausfinden. Ich habe auch unvollständigen Code und arbeite noch daran:

#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; 
} 

ich auch einen Blick auf dem Beispielcode von diesem Link: http://www.cplusplus.com/reference/algorithm/max_element/ aber nur für Vektor arbeiten.

Auch wenn ich die size = sizeof(x_vec)/sizeof(x_vec[0]); berechnen Ich erwarte size = 8 (wegen 8 Vektor-Komplex oben), aber ich habe mich nur size = 6.

+1

, wenn die Größe des Vektors zu finden, verwenden Sie 'vec.size()'. Die sizeof-Berechnung ist eine c-style-Methode, und Sie wenden sie auf ein Vektorobjekt an (das normalerweise drei Zeiger enthält und daher die Größe von drei Zeigern hat) und sein erstes Element (das die Größe eines beliebigen Typs hat) der Vektor speichert) – jaggedSpire

+0

Darüber hinaus ist es unklar, was Sie mit minimalem Maximum und Position in diesem Kontext genau meinen - Sie könnten sich auf den Eintrag im Vektor mit der kleinsten/größten Größe beziehen und den Index dieses Elements erhalten. Oder Sie könnten nach der kleineren/größeren der realen und imaginären Zahlen fragen, die jede komplexe Zahl bilden, und eine Angabe darüber, welche welche ist. – jaggedSpire

+1

In der Tat, wenn Sie jedes Element in 'vec' besuchen möchten, verwenden Sie stattdessen ein' range-based for': for (const auto & c: vec) {cout << c << endl; } ' –

Antwort

4

vector<complex> mit std::max_element verwenden zu können, müssen Sie eine Funktion schaffen, die vergleicht die Werte von zwei complex Objekten. Sie müssen dies tun, da es mehrere Möglichkeiten gibt, diese zu vergleichen.

Eine Möglichkeit besteht darin, eine Lambda-Funktion zu schreiben, die zwei complexe mit std::abs vergleicht. Sie können dies in Ihren Anruf max_element schreiben:

// 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 erzeugt einen Iterator den Maximalwert enthält, gefunden. Der Index des Iterator in dem Vektor kann std::distance gefunden werden:

cout << "Max position: " << std::distance(vec.begin(), maxelem) << endl; 

Die complex Komparator-Funktion in einem auto zur Wiederverwendung gespeichert werden können:

// 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); }; 

Wir haben es mit verschiedenen anderen Standard Library verwenden Algorithmen wie min_element und 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; 
} 

Ausgänge:

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) 

Zugegeben, es ist nicht so eloquent wie [mag_x idx_x] = max(abs(X));!

An online demonstration is on Wandbox here.

+0

Die [' max_element 'Dokumentation] (http://en.cppreference.com/w/cpp/algorithm/max_element) zeigt, wie man die Position des maximalen Elements innerhalb des Vektors findet - ist das, was du damit meinst " Position"? –

+0

Jack Deeth: Meine Antwort ist "Ja". Ich versuche Code von Matlab nach C++ zu konvertieren, es ist kompliziert, aber es wird mir helfen, den Zeitaufwand zu reduzieren. –

+0

Jack Deeth: Es tut mir leid für das fehlende Wissen, aber ich möchte Ihnen eine Frage bezüglich des Ideals stellen, das Sie gerade vorgeschlagen haben. Ich benutze Eclipse-Plattform in Ubuntu OS. wenn ich versuchte zu testen mit: auto absLess = [] (auto a, auto b) {zurück abs (a)

Verwandte Themen