求解最近邻基向量

#include <iostream>
#include<cmath>
#include <iomanip>
using namespace std;
double compare(double arr[],int len,int *num);//定义一个函数用于返回两个值,min和num
int main()
{
	int d, n;
	double dis;
	while (cin >> d >> n)//多组输入,维度d和基向量个数n
	{
		double* p = new double[d];//申请两个数组的动态内存
		double* q = new double[d];
		for (int i = 0; i < d; i++)
		{
			cin >> p[i];//数组p用于储存目标向量
		}
		double arr[100];//定义一个数组用于收集计算出的距离
		for (int j = 0; j < n; j++)
		{
			double sum = 0;
			for (int k = 0; k < d; k++)
			{
				cin >> q[k];//数组q用于储存基向量
				sum = sum + pow((q[k] - p[k]), 2);//计算差的平方和
			}
			dis = sqrt(sum);//平方和开根
			arr[j] = dis;//将结果储存在数组arr中
		}
		int num;
		double min;
		min = compare(arr, n, &num);//调用函数,返回最小值以及对于的序号
		cout.setf(ios::fixed);//该函数用于确定小数点后显示的位数
		cout << num << " " << setprecision(2)<<min << endl;//输出
		delete[]p;
		delete[]q;//释放内存
	}
	return 0;
}
double compare(double arr[],int len,int *num)
{
	double min = arr[0];
	for (int j = 0; j < len; j++)
	{
		if (arr[j] < min)
		{
			min = arr[j];
			*num = j;//指针指向最小值对应的序号
		}
	}
	return min;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值