1.实验要求
实验三:余弦相似度计算实验
输入两个向量,计算两个向量的余弦相似度。向量分量以“,”分隔。
2. 程序运行
示例1
示例2
示例3,当两向量的分量数不相等时(弹出对话框提示错误)
3.项目构成
4.源代码
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMessageBox>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_ptn_cal_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "sourcefile.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
void MainWindow::on_ptn_cal_clicked()
{
QString one=ui->lineEdit_one->text();
QString two=ui->lineEdit_two->text();
int N=count(one);
if(count(two)!=N)
{
QMessageBox::information(NULL,QString("错误"),QString("两个向量的分量数不相等"),QMessageBox::Cancel);
}
else
{
qDebug()<<"N:"<<N<<endl;
double *oneArray=new double[N];
double *twoArray=new double[N];
qDebug()<<"分割向量1"<<one<<endl;
split(N,one,oneArray);//获取向量一的分量,填充oneArray
qDebug()<<"分割向量2"<<two<<endl;
split(N,two,twoArray);//获取向量二的分量,填充twoArray
for(int i=0;i<N;i++)
{
qDebug()<<oneArray[i]<<"和";
}
qDebug()<<endl;
for(int i=0;i<N;i++)
{
qDebug()<<twoArray[i]<<"和";
}
double coskey=cal(N,oneArray,twoArray);
qDebug()<<"coskey:"<<coskey;
ui->lineEdit_key->setText(QString::number(coskey));
}
}
MainWindow::~MainWindow()
{
delete ui;
}
sourcefile.h
#include<QString>
#include<QDebug>
#include<QByteArray>
#include<QList>
int count(QString s);//计算向量s的维数
void split(const int N,QString s,double *array);//根据向量的维数分割出这个向量的分量
double cal(int N,double *oneArray,double *twoArray);//计算余弦相似度
sourcefile.cpp
#include "sourcefile.h"
int count(QString s)//计算向量s的维数
{
int count=0;
s.replace(',',',');
for (int i = 0; i < s.size();i++)
{
if (s[i] == ',')
{
count++;
}
}
count = count+1;
return count;
}
void split(const int N,QString s,double *array)//根据向量的维数分割出这个向量的分量
{
QList<QString> list=s.split(',');
for(int i=0;i<list.length();i++)
{
array[i]=list[i].toDouble();
}
}
double cal(int N,double *oneArray,double *twoArray)//计算余弦相似度
{
double coskey;
double fz=0;
double fm=0;
for(int i=0;i<N;i++)
{
fz=fz+oneArray[i]*twoArray[i];
}
double onefm=0;
double twofm=0;
for(int i=0;i<N;i++)
{
onefm=onefm+oneArray[i]*oneArray[i];
twofm=twofm+twoArray[i]*twoArray[i];
}
qDebug()<<"fz:"<<fz;
qDebug()<<"onefm"<<onefm<<" "<<"twofm"<<twofm;
fm=sqrt(onefm)*sqrt(twofm);
qDebug()<<"fm"<<fm;
coskey=fz/fm;
return coskey;
}
本程序主要实现了
1.各种维数向量的余弦相似度计算
2.消息对话框的简单使用