Odelglosc euklidesowa

0

Witam. Potrzebuje pomocy. Mam przestrzen n wymiarowa i posiadam obliczone punkty (niezdominowane) w 2 kontenerach. I teraz na rzecz 2 kontenerów musze obliczyć odleglosc eulkidesowa miedzy tymi punktami. (W obu kontenerach sa identyczne punkty- kopia) Proszę o szybka o pomoc.

#include<iostream>
#include<vector>
#include<algorithm>
#include<numeric>
#include<random>
#include<iterator>

using namespace std;

class generatorLiczbNorm {
	// static – poniewa¿ ma byæ jeden generator dla ca³ego programu: 
	static default_random_engine rng;

	// produkuje liczby o rozk³. normalnym korzystaj¹c z generatora rng:
	normal_distribution<double> dist;

public:
	generatorLiczbNorm(double mi = 0, double sigma = 1) : dist(mi, sigma) {};

	double operator()() {
		return dist(rng);
	}
};

default_random_engine generatorLiczbNorm::rng;


//funkcje do generowania i losowania
double losowanie()
{
	generatorLiczbNorm r(5,10);
	return r();
}

void generate(vector<double> & gen)
{
	generate(gen.begin(), gen.end(), losowanie);
}

//funkcja wypisz
void wypisz(vector<double> v)
{
	ostream_iterator<double> str(cout, "; ");
	copy(v.begin(), v.end(), str);
	cout << endl;
}

double diffPow2(double x, double y) { return pow((x - y), 2.0); };

int main() 
{
	int n;
	cout << "Prosze podac wymiar: ";
	cin >> n;

	vector<double> A(n);
	vector<vector<double>> P(100, A),B;
	//generowanie liczb
	for_each(P.begin(),P.end(),generate);
	
	for (auto const & x : P)
	{
		bool flag = true;
		for (auto const & y : P)
		{
			for (int i = 0; i < n; ++i)
			{
				if (x[i] < y[i])
				{
					flag = false;
				}
			}
			if (flag) break;
		}
		if (flag)
		{
			B.push_back(x);
		}
	}
	vector<vector<double>> C(B);

	//wypisywanie
	//for_each(B.begin(), B.end(), wypisz);
	cout << "Punkty: " << endl;
	for_each(C.begin(), C.end(), wypisz);

	/*double odlegEuklid = inner_product(B.begin()->begin(), B.end()->end(), C.begin()->begin(), 0.0, plus<double>(), diffPow2);
	odlegEuklid = sqrt(odlegEuklid);
	cout <<"Odelglosc Euklidesowa: " <<odlegEuklid << endl;
*/
	return 0;
}

1
karwan33 napisał(a):

Witam. Potrzebuje pomocy. Mam przestrzen n wymiarowa i posiadam obliczone punkty (niezdominowane) w 2 kontenerach. I teraz na rzecz 2 kontenerów musze obliczyć odleglosc eulkidesowa miedzy tymi punktami. (W obu kontenerach sa identyczne punkty- kopia) Proszę o szybka o pomoc.

#include<iostream>
#include<vector>
#include<algorithm>
#include<numeric>
#include<random>
#include<iterator>

using namespace std;

class generatorLiczbNorm {
	// static – poniewa¿ ma byæ jeden generator dla ca³ego programu: 
	static default_random_engine rng;

	// produkuje liczby o rozk³. normalnym korzystaj¹c z generatora rng:
	normal_distribution<double> dist;

public:
	generatorLiczbNorm(double mi = 0, double sigma = 1) : dist(mi, sigma) {};

	double operator()() {
		return dist(rng);
	}
};

default_random_engine generatorLiczbNorm::rng;


//funkcje do generowania i losowania
double losowanie()
{
	generatorLiczbNorm r(5,10);
	return r();
}

void generate(vector<double> & gen)
{
	generate(gen.begin(), gen.end(), losowanie);
}

//funkcja wypisz
void wypisz(vector<double> v)
{
	ostream_iterator<double> str(cout, "; ");
	copy(v.begin(), v.end(), str);
	cout << endl;
}

double diffPow2(double x, double y) { return pow((x - y), 2.0); };

int main() 
{
	int n;
	cout << "Prosze podac wymiar: ";
	cin >> n;

	vector<double> A(n);
	vector<vector<double>> P(100, A),B;
	//generowanie liczb
	for_each(P.begin(),P.end(),generate);
	
	for (auto const & x : P)
	{
		bool flag = true;
		for (auto const & y : P)
		{
			for (int i = 0; i < n; ++i)
			{
				if (x[i] < y[i])
				{
					flag = false;
				}
			}
			if (flag) break;
		}
		if (flag)
		{
			B.push_back(x);
		}
	}
	vector<vector<double>> C(B);

	//wypisywanie
	//for_each(B.begin(), B.end(), wypisz);
	cout << "Punkty: " << endl;
	for_each(C.begin(), C.end(), wypisz);

	/*double odlegEuklid = inner_product(B.begin()->begin(), B.end()->end(), C.begin()->begin(), 0.0, plus<double>(), diffPow2);
	odlegEuklid = sqrt(odlegEuklid);
	cout <<"Odelglosc Euklidesowa: " <<odlegEuklid << endl;
*/
	return 0;
}

To jest ill-formed bo mieszasz std::generate z ::generate. Dlatego nie powinno sie uzywać całego std przez using. Tu masz fixa na błąd kompilacji: https://wandbox.org/permlink/EGD4Fct7oX3kQPf3

1 użytkowników online, w tym zalogowanych: 0, gości: 1