Qt5 余弦相似度计算器

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值