向量点乘最小值

两个n维的向量,向量的点乘是指将向量对应维度的乘积相加,但是我们可以将向量维度交换下可以得到更小的向量点乘,例如3维向量:【1, 3, ?5】和【4,
?2, ?1】,最小向量点乘为-27,即将维度变为:[3,1,-5]和[-2,-1,4],程序设计要求:输入一个整数n为向量的维度,然后输入两个n维度的向量,用空格区别向量元素,输出为一行,包含一个整数,为最小的点乘。

我写的代码为:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int fun(int*,int*,const int);
void main()
{
	cout<<"please enter the dimension of the vetor: ";
	int n;
	cin>>n;
	cout<<"the first vector: ";
	int *x=new int[n];
	for(int i=0;i<n;i++)
	{
		cin>>x[i];
	}
	cout<<"the second vector:";
	int *y=new int[n];
	for(int i=0;i<n;i++)
	{
		cin>>y[i];
	}

	cout<<fun(x,y,n);

}

int fun(int* A,int *B,const int n)
{
	int temp=0,temp1=0,index=0;
	vector<int> vec;
	for(int i=0;i<n;i++)
	{
		vec.push_back(i);
	}
	sort(vec.begin(),vec.end());
	for(int i=0;i<n;i++)
	{
		temp1+=A[i]*B[i];
	}
	while(next_permutation(vec.begin(),vec.end()))
	{
		for(int i=0;i<n;i++)
		{
			index=vec[i];
			temp+=A[index]*B[i];
		}
		if(temp<temp1) temp1=temp;
		temp=0;
	}
	return temp1;
}

写程序遇到最大的问题是怎么将一个数组全排列,自己写代码没写成功,后来查了下有没有这样的函数,发现c++中对容器或者数组可以进行全排列的函数为sort(),next_permutation(),这样就解决了全排列遍历的问题,程序中我将其中一个向量的指标index进行全排列,然后分别计算出点积的大小,返回最小值。

当然也可以直接对其中一个向量的元素进行全排列,然后计算出对应的点积,返回最小值:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int fun(int*,int*,const int);
inline void res(int *H,int n);
inline int fac(int x);
void main()
{
	cout<<"please enter the dimension of the vetor: ";
	int n;
	cin>>n;
	cout<<"the first vector: ";
	int *x=new int[n];
	for(int i=0;i<n;i++)
	{
		cin>>x[i];
	}
	cout<<"the second vector:";
	int *y=new int[n];
	for(int i=0;i<n;i++)
	{
		cin>>y[i];
	}

	cout<<fun(x,y,n);

}

int fun(int* A,int *B,const int n)
{
	int temp=0,temp1=0,index=0;
	for(int i=0;i<n;i++)
	{
		temp1+=A[i]*B[i];
	}
	sort(A,A+n);
	vector<int> vec;
	while(next_permutation(A,A+n))
	{
		for(int i=0;i<n;i++)
		{
			temp+=A[i]*B[i];
		}
		if(temp<temp1)
		{
			temp1=temp;
			vec.clear();
			vec.insert(vec.begin(),A,A+n);
		}
		temp=0;
	}
	for(vector<int>::iterator ite=vec.begin();ite<vec.end();ite++)
		cout<<*ite<<'\t';
	cout<<endl;
	return temp1;
}

上面代码的输出部分增加了,最后得到的最小点积所对应的向量元素的排列。

向量点乘最小值

时间: 2024-07-29 10:08:33

向量点乘最小值的相关文章

opencv reduce()函数

CvSize CvReduce(//完毕由op指定的约简 const CvArr* src,//目标矩阵 CvArr* dst,//结果矩阵 int dim = -1,//因子系数,//1合并成行,0合并成列.-1转化成相应的dis int op = CV_REDUCE_SUM//指定约简法则 ); op的值 结果 CV_REDUCE_SUM 计算全部向量的总和 CV_REDUCE_AVG 计算全部向量的平均值 CV_REDUCE_MAX 计算全部向量中的最大值 CV_REDUCE_MIN 计算

《得知opencv》注意事项——矩阵和图像处理——cvOr,cvOrS,cvrReduce,cvRepeat,cvScale,cvSet and cvSetZero

矩阵和图像的操作 (1)cvOr函数 其结构 void cvOr(//两个矩阵相应元素做或执行 const CvArr* src1,//矩阵1 const CvArr* src2,//矩阵2 CvArr* dst,//结果矩阵 const CvArr* mask = NULL//矩阵"开关" ); 实例代码 #include <cv.h> #include <highgui.h> #include <stdio.h> int main(int arg

第四十二篇 Numpy的基本操作——索引相关

No.1. 使用np.argmin和np.argmax来获取向量元素中最小值和最大值的索引 No.2. 使用np.random.shuffle将向量中的元素顺序打乱,操作后,原向量发生改变:使用np.sort将乱序的向量进行排序,并将顺序的向量进行返回,原向量不发生改变 如果要将原来的乱序向量转化成顺序向量,需要使用x.sort,效果如下: No.3. 对矩阵中的元素进行排序 No.4. 使用np.argsort返回从小到大每个元素的索引值组成的向量 No.5. 使用np.partition返回

关于过拟合、局部最小值、以及Poor Generalization的思考

Poor Generalization 这可能是实际中遇到的最多问题. 比如FC网络为什么效果比CNN差那么多啊,是不是陷入局部最小值啊?是不是过拟合啊?是不是欠拟合啊? 在操场跑步的时候,又从SVM角度思考了一下,我认为Poor Generalization属于过拟合范畴. 与我的论文 [深度神经网络在面部情感分析系统中的应用与改良] 的观点一致. SVM ImageNet 2012上出现了一个经典虐杀场景.见[知乎专栏] 里面有一段这么说道: 当时,大多数的研究小组还都在用传统compute

向量的相似性度量

距离计算方法总结 在做分类时常常需要估算不同样本之间的相似性度量(Similarity Measurement),这时通常采用的方法就是计算样本间的"距离"(Distance).采用什么样的方法计算距离是很讲究,甚至关系到分类的正确与否. 本文的目的就是对常用的相似性度量作一个总结. 本文目录: 1. 欧氏距离 2. 曼哈顿距离 3. 切比雪夫距离 4. 闵可夫斯基距离 5. 标准化欧氏距离 6. 马氏距离 7. 夹角余弦 8. 汉明距离 9. 杰卡德距离 & 杰卡德相似系数

关于SVM--支持向量机的一个故事

关于SVM(support vector machine)--支持向量机的一个故事 很久很久以前,有个SVM, 然后,……………………被deep learning 杀死了…………………………………… 完结……撒花 故事的起源: 好吧,关于支持向量机有一个故事 ,故事是这样子的: 在很久以前的情人节,大侠要去救他的爱人,但魔鬼和他玩了一个游戏. 魔鬼在桌子上似乎有规律放了两种颜色的球,说:“你用一根棍分开它们?要求:尽量在放更多球之后,仍然适用.” 于是大侠这样放,干的不错? 然后魔鬼,又在桌上放

R简单算术操作符&lt;函数和+-*/&gt;,缺失值,正则向量,向量运算&lt;索引&gt;(二)

赋值操作 x <- c(1,2,3); x = c(1,2,3); c(1,2,3) -> x; assign("x", c(1,2,3)); 这四种形式在大部分时候都能达到一致的效果.推荐使用第一种 1:向量的定义 一串有序数值构成的数值向量(vector) ,创建一个向量我们使用c(num1,num2,num3); 在 R 环境里面,单个的数值也是被看作长度为1的向量. 1.1 向量的基本运算 在算术表达式中使用向量将会对该向量的每一个元素都进行同样算术运算.出现 在同

R语言入门心得(3) -- 向量相关

向量定义 R在实际应用中比较常用的一个对象就是向量(Vector).向量的创建格式为 向量名 = c(x1,x2,x3,…..)  或  向量名 <- c(x1,x2,x3,…..) 或  c(x1,x2,x3,…..) -> 向量名 或  Assign("向量名", c(x1,x2,x3,…..)),c()为向量赋值函数,c()可以有任意多个参数,而起返回值则是一个把这些参数首尾相连形成的向量.你可以在命令行中输入?c或者help(c)来查看函数的详细信息.例如我们要创建

SVM-支持向量机算法概述

(一)SVM的背景简单介绍 支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本.非线性及高维模式识别中表现出很多特有的优势,并可以推广应用到函数拟合等其它机器学习问题中[10]. 支持向量机方法是建立在统计学习理论的VC 维理论和结构风险最小原理基础上的,依据有限的样本信息在模型的复杂性(即对特定训练样本的学习精度,Accuracy)和学习能力(即无错误地识别随意样本的能力)之间寻求最佳折衷,以期获得最好的推广能力[14]