Qt5 余弦相似度计算器

1.实验要求

  实验三:余弦相似度计算实验
  输入两个向量,计算两个向量的余弦相似度。向量分量以“,”分隔。

2. 程序运行

示例1
Qt5 余弦相似度计算器_第1张图片
示例2
Qt5 余弦相似度计算器_第2张图片
示例3,当两向量的分量数不相等时(弹出对话框提示错误)
Qt5 余弦相似度计算器_第3张图片

3.项目构成

Qt5 余弦相似度计算器_第4张图片

4.源代码

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include 
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 
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
#include
#include
#include
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.消息对话框的简单使用

你可能感兴趣的:(Qt)