Time:2020.01.16
PART One
这里首先定义了一个5*5的数组,目的是求解数组每行的最小的和次之的两个数据,该程序实现了矩阵每行最小的两个值的程序。
目的:为了求矩阵中每行最小的和次之的两个数据的位置,考虑先找到目标数据,然后对其定位。
int main() {
nx=5;
ny=5;
//
int b=100,a=30;
vector<vector<double>> H(nx,vector<double>(ny));
//产生一个30~100内的随机数组:
for(int i=0;i<nx;i++){
for(int j=0;j<ny;j++){
H[i][j]=0.01+(rand()%(b-a+1)+a);
cout<<"H[][]"<<H[i][j]<<endl;//打印出来康康
}
}
//定义一个一维数组来存放5*5数组的每行的数据:
double array[ny];
for(int i=0;i<nx;i++){
for(int j=0;j<ny;j++){
array[j]=H[i][j];
}
double m1,m2;//存储两个最小值
m1=9999; m2=9999;
for(int i=0;i<ny;i++){
if(array[i]<m1){
m2=m1;
m1=array[i];
}
else if(array[i]<m2){
m2=array[i];
}
}
cout<<"m1:"<<m1<<endl;
cout<<"m2:"<<m2<<endl;
}
return 0;
}
将其略作整理,改写成:
int main() {
nx=5;
ny=5;
//
int b=100,a=30;
vector<vector<double>> H(nx,vector<double>(ny));
double array[ny];
for(int i=0;i<nx;i++){//一行一行处理,以下程序都是在i相同的前提下:
for(int j=0;j<ny;j++){
H[i][j]=0.01+(rand()%(b-a+1)+a);
array[j]=H[i][j];
//cout<<"H[][]"<<H[i][j]<<endl;
}
//对这一行的数据求目标值并输出该值:m1,m2
double m1,m2;//存储两个最小值
m1=9999; m2=9999;
for(int i=0;i<ny;i++){
if(array[i]<m1){
m2=m1;
m1=array[i];
}
else if(array[i]<m2){
m2=array[i];
}
}
cout<<"m1:"<<m1<<endl;
cout<<"m2:"<<m2<<endl;
}
return 0;
}
PART Two
在第一部分的基础上,得到了每行的目标值,接下来的任务是定位目标值,并将其所在位置的值置为1,其余的值置为0。
本篇的前提是:矩阵是x集中的元素与y集中元素的几何距离,几何距离越小,理论上其感兴趣程度越高。
这一步的目的是为后边使用匈牙利算法匹配铺路,因为在匈牙利算法中,需要确定x集中的元素对y集中元素的感兴趣状况,将感兴趣为1,不感兴趣为0。
定位目标值并置位的好处在于,如果某行存在两个及以上的目标值,不会造成目标丢失的情况。
int main() {
nx=5;
ny=5;
//
int b=100,a=30;
vector<vector<double>> H(nx,vector<double>(ny));
vector<vector<double>> H1(nx,vector<double>(ny));
double array[ny];
for(int i=0;i<nx;i++){
for(int j=0;j<ny;j++){
H[i][j]=0.01+(rand()%(b-a+1)+a);
array[j]=H[i][j];
cout<<"H["<<i<<"]"<<"["<<j<<"]"<<H[i][j]<<endl;
}
double m1,m2;//存储两个最小值
m1=9999;
m2=9999;
for(int k=0;k<ny;k++){
if(array[k]<m1){
m2=m1;
m1=array[k];
}
else if(array[k]<m2){
m2=array[k];
}
}
//cout<<"m1:"<<m1<<endl;cout<<"m2:"<<m2<<endl;
for(int l=0;l<ny;l++){
if(array[l]==m1){
H1[i][l]=1;
}
else if(array[l]==m2){
H1[i][l]=1;
}
else {
H1[i][l]=0;
}
}
}
for(int m=0;m<nx;m++){
for(int n=0;n<ny;n++){
cout<<"H1["<<m<<"]"<<"["<<n<<"]"<<g[m][n]<<endl
}
}
return 0;
}