用Qt+NetCDF 读取NC文件

用Qt+NetCDF 读取NC文件_ivqtnc-CSDN博客

基于NetCDF-CXX4 封装,对NC文件进行读取,读取内存放到vector中。

ncBase.h

#ifndef  __NC_BASE_H__
#define __NC_BASE_H__
 
#include <QVariant>
#include <vector>
#include <map>
using namespace std;
 
typedef std::vector<float> _dataVector_f;   //存放一维数据
typedef std::vector<double> _dataVector_d;   //存放一维数据
typedef std::vector<QString> _dataVector_s;   //存放一维数据
typedef std::vector<_dataVector_d> _3DDataVector_v;   //存放三维数据
typedef QPair<float, float> _Pos;
 
 
Q_DECLARE_METATYPE(_dataVector_d)
Q_DECLARE_METATYPE(_3DDataVector_v)
 
#endif

ncReader.h

#pragma once
#ifndef _NC_READER_H_
#define _NC_READER_H_
 
#include "qfileinfo.h"
#include "ncBase.h"
#include <QMap>
#include <QString>
#include <Qvector>
#include <QFileInfo>
#include <QDir>
#include <QTimer>
#include <netcdfcpp.h>
#include "../../Z_PlantInterface/plantinterface.h"
 
 
using namespace  std;
using  namespace netCDF;
 
class ncReader :QObject
{
	Q_OBJECT
private:
	QString curFilePath;
	CPlantInterface* m_pInterface;
	NcFile *m_pDataFile{};
public:
	ncReader(QString filePath);
	~ncReader();
 
	void SetPlantInterface(CPlantInterface* pInterface) { m_pInterface = pInterface; };
	bool ReadData_D(_dataVector_d& vet_data, QString strEle, long l0 = -1, long l1 = -1, long l2 = -1, long l3 = -1, long l4 = -1);
	bool ReadData_F(_dataVector_f& vet_data, QString strEle, long l0 = -1, long l1 = -1, long l2 = -1, long l3 = -1, long l4 = -1);
	long *GetEleEdge(QString strElement);
	NcVar* GetVar(QString strEle);
	QString getfilePath();
	int  GetVarNums();
	void GetVars(_dataVector_s &vet_Vars);
};
 
#endif

ncReader.cpp

#include"ncReader.h"
#include<qdebug.h>
#include <QPixmap>
#include <QFile>
#include <QDataStream>
#include <QApplication>
#include <QSettings>
#include <iostream>
#include <QDateTime>
#include <string.h>
 
 
ncReader::ncReader(QString filePath) :curFilePath(filePath)
{
	//中文字符串转换
	std::string pathstr = filePath.toLocal8Bit();
	const char* temp = pathstr.c_str();
	m_pDataFile = new NcFile(temp, NcFile::read);//只读文件中的数据
}
 
 
ncReader::~ncReader()
{
 
}
 
 
bool ncReader::ReadData_D(_dataVector_d& vet_data, QString strEle, long l0 /*=-1*/, long l1/*=-1*/, long l2/*=-1*/, long l3 /*= -1*/, long l4 /*= -1*/)
{
	if (m_pDataFile->isNull() || !m_pDataFile)
		return false;
	if (l0 < -1 || l1 < -1 || l2 < -1 || l3 < -1 || l4 < -1)
		return false;
 
	long lg0 = 1, lg1 = 1, lg2 = 1, lg3 = 1, lg4 = 1, lg5 = 1;
 
	long *p = GetEleEdge(strEle);
	
	NcVar pVar = m_pDataFile->getVar(strEle.toStdString().c_str());
	if (pVar.isNull())
		return false;
 
	int nDims = pVar.getDimCount();
 
	std::vector<size_t> vet_Inx;//存放每个维度上索引(开始位置)
	std::vector<size_t> vet_Count;//存放索引(数量) value >=1
	vet_Inx.clear();
	switch (nDims)
	{
	case 1://1维
	{
		float* data = new float[p[0]];
 
		pVar.getVar(data);
 
		_dataVector_d vet_tmp(data, data + p[0]);
		vet_data.swap(vet_tmp);
		delete[]data;
	}
	break;
	case 2://2维
	{
		long long nLen = 1;
 
		if (l0 == -1)
		{
			nLen *= p[0];
			lg0 = p[0];
			vet_Inx.push_back(0);
			vet_Count.push_back(lg0);
		}
		else
		{
			vet_Inx.push_back(l0);
			vet_Count.push_back(1);
		}
		if (l1 == -1)
		{
			nLen *= p[1];
			lg1 = p[1];
			vet_Count.push_back(lg1);
			vet_Inx.push_back(0);
			vet_Count.push_back(lg1);
		}
		else
		{
			vet_Inx.push_back(l1);
			vet_Count.push_back(1);
		}
	
		float* data = new float[nLen];
		pVar.getVar(vet_Inx, vet_Count, data);
		_dataVector_d vet_tmp(data, data + nLen);//转存,效率提升170倍
		vet_data.swap(vet_tmp);
		delete[]data;
		
	}
	break;
	case 3://3维
	{
		long nLen = 1;
		if (l0 == -1)
		{
			nLen *= p[0];
			lg0 = p[0]; 
			vet_Inx.push_back(0);
			vet_Count.push_back(lg0);
		}
		else
		{
			vet_Inx.push_back(l0);
			vet_Count.push_back(1);
		}
		if (l1 == -1)
		{
			nLen *= p[1];
			lg1 = p[1]; 
			vet_Inx.push_back(0);
			vet_Count.push_back(lg1);
		}
		else
		{
			vet_Inx.push_back(l1);
			vet_Count.push_back(1);
		}
		if (l2 == -1)
		{
			nLen *= p[2];
			lg2 = p[2]; 
			vet_Inx.push_back(0);
			vet_Count.push_back(lg2);
		}
		else
		{
			vet_Inx.push_back(l2);
			vet_Count.push_back(1);
		}
 
		
		
		float fscale = 1.0f;
		float foffset = 0.0f;
 
		float* data = new float[nLen];
		pVar.getVar(vet_Inx, vet_Count, data);
		_dataVector_d vet_tmp(data, data + nLen);//转存,效率提升170倍
		if (fscale != 1.0f || foffset != 0.0f)
		{
			int n = 0;
			for (auto it : vet_tmp)
			{
				vet_tmp[n] = it * fscale + foffset;
				n++;
			}
		}
		vet_data.swap(vet_tmp);
		delete[]data;
 
	}
	break;
	case 4://4维
	{
		long nLen = 1;
		if (l0 == -1)
		{
			nLen *= p[0];
			lg0 = p[0];
			vet_Inx.push_back(0);
			vet_Count.push_back(lg0);
		}
		else
		{
			vet_Inx.push_back(l0);
			vet_Count.push_back(1);
		}
		if (l1 == -1)
		{
			nLen *= p[1];
			lg1 = p[1];
			vet_Inx.push_back(0);
			vet_Count.push_back(lg1);
		}
		else
		{
			vet_Inx.push_back(l1);
			vet_Count.push_back(1);
		}
		if (l2 == -1)
		{
			nLen *= p[2];
			lg2 = p[2];
			vet_Inx.push_back(0);
			vet_Count.push_back(lg2);
		}
		else
		{
			vet_Inx.push_back(l2);
			vet_Count.push_back(1);
		}
		if (l3 == -1)
		{
			nLen *= p[3];
			lg3 = p[3];
			vet_Inx.push_back(0);
			vet_Count.push_back(lg3);
		}
		else
		{
			vet_Inx.push_back(l3);
			vet_Count.push_back(1);
		}
 
		float* data = new float[nLen];
		pVar.getVar(vet_Inx, vet_Count, data);
		_dataVector_d vet_tmp(data, data + nLen);//转存,效率提升170倍
		vet_data.swap(vet_tmp);
		delete[]data;
		
	}
	break;
	case 5://5维
	{
		long nLen = 1;
		if (l0 == -1)
		{
			nLen *= p[0];
			lg0 = p[0];
			vet_Inx.push_back(0);
			vet_Count.push_back(lg0);
		}
		else
		{
			vet_Inx.push_back(l0);
			vet_Count.push_back(1);
		}
		if (l1 == -1)
		{
			nLen *= p[1];
			lg1 = p[1];
			vet_Inx.push_back(0);
			vet_Count.push_back(lg1);
		}
		else
		{
			vet_Inx.push_back(l1);
			vet_Count.push_back(1);
		}
		if (l2 == -1)
		{
			nLen *= p[2];
			lg2 = p[2];
			vet_Inx.push_back(0);
			vet_Count.push_back(lg2);
		}
		else
		{
			vet_Inx.push_back(l2);
			vet_Count.push_back(1);
		}
		if (l3 == -1)
		{
			nLen *= p[3];
			lg3 = p[3];
			vet_Inx.push_back(0);
			vet_Count.push_back(lg3);
		}
		else
		{
			vet_Inx.push_back(l3);
			vet_Count.push_back(1);
		}
		if (l4 == -1)
		{
			nLen *= p[4];
			lg4 = p[4];
			vet_Inx.push_back(0);
			vet_Count.push_back(lg4);
		}
		else
		{
			vet_Inx.push_back(l4);
			vet_Count.push_back(1);
		}
 
		float* data = new float[nLen];
		pVar.getVar(vet_Inx, vet_Count, data);
		_dataVector_d vet_tmp(data, data + nLen);//转存,效率提升170倍
		vet_data.swap(vet_tmp);
		delete[]data;
		
	}
	break;
	default:
		break;
	}
}
 
bool ncReader::ReadData_F(_dataVector_f& vet_data, QString strEle, long l0 /*=-1*/, long l1/*=-1*/, long l2/*=-1*/, long l3 /*= -1*/, long l4 /*= -1*/)
{
	if (m_pDataFile->isNull() || !m_pDataFile)
		return false;
	if (l0 < -1 || l1 < -1 || l2 < -1 || l3 < -1 || l4 < -1)
		return false;
 
	long lg0 = 1, lg1 = 1, lg2 = 1, lg3 = 1, lg4 = 1, lg5 = 1;
	long *p = GetEleEdge(strEle);
 
	NcVar pVar = m_pDataFile->getVar(strEle.toStdString().c_str());
	if (pVar.isNull())
		return false;
 
	int nDims = pVar.getDimCount();
 
	std::map<std::string, NcVarAtt> map_atts = pVar.getAtts();//获取所有的属性,因为获取不存在的属性会崩溃
 
	std::vector<size_t> vet_Inx;//存放每个维度上索引(开始位置)
	std::vector<size_t> vet_Count;//存放索引(数量) value >=1
	vet_Inx.clear();
	switch (nDims)
	{
	case 1://1维
	{
		float* data = new float[p[0]];
		pVar.getVar(data);
 
		_dataVector_f vet_tmp(data, data + p[0]);
		vet_data.swap(vet_tmp);
		delete []data;
	}
	break;
	case 2://2维
	{
 
		long long nLen = 1;
 
		if (l0 == -1)
		{
			nLen *= p[0];
			lg0 = p[0];
			vet_Inx.push_back(0);
			vet_Count.push_back(lg0);
		}
		else
		{
			vet_Inx.push_back(l0);
			vet_Count.push_back(1);
		}
		if (l1 == -1)
		{
			nLen *= p[1];
			lg1 = p[1];
			vet_Count.push_back(lg1);
			vet_Inx.push_back(0);
			vet_Count.push_back(lg1);
		}
		else
		{
			vet_Inx.push_back(l1);
			vet_Count.push_back(1);
		}
 
		float* data = new float[nLen];
		pVar.getVar(vet_Inx, vet_Count, data);
		_dataVector_f vet_tmp(data, data + nLen);//转存,效率提升170倍
		vet_data.swap(vet_tmp);
		delete[]data;
 
	}
	break;
	case 3://3维
	{
		long nLen = 1;
		if (l0 == -1)
		{
			nLen *= p[0];
			lg0 = p[0];
			vet_Inx.push_back(0);
			vet_Count.push_back(lg0);
		}
		else
		{
			vet_Inx.push_back(l0);
			vet_Count.push_back(1);
		}
		if (l1 == -1)
		{
			nLen *= p[1];
			lg1 = p[1];
			vet_Inx.push_back(0);
			vet_Count.push_back(lg1);
		}
		else
		{
			vet_Inx.push_back(l1);
			vet_Count.push_back(1);
		}
		if (l2 == -1)
		{
			nLen *= p[2];
			lg2 = p[2];
			vet_Inx.push_back(0);
			vet_Count.push_back(lg2);
		}
		else
		{
			vet_Inx.push_back(l2);
			vet_Count.push_back(1);
		}
 
 
		//查看压缩值
		float fscale = 1.0f;
		float foffset = 0.0f;
		
		if (map_atts.find("scale_factor") != map_atts.end())
		{
			NcVarAtt AttT = pVar.getAtt("scale_factor");
			if (!AttT.isNull())
			{
				NcType TypeId = AttT.getType();
 
				if (TypeId == NC_FLOAT || TypeId == NC_DOUBLE)
					AttT.getValues(&fscale);
			}
		}
		
		if (map_atts.find("add_offset") != map_atts.end())
		{
			NcVarAtt AttS = pVar.getAtt("add_offset");
			if (!AttS.isNull())
			{
				NcType TypeId = AttS.getType();
 
				if (TypeId == NC_FLOAT || TypeId == NC_DOUBLE)
					AttS.getValues(&foffset);
			}
		}
 
		float* data = new float[nLen];
		pVar.getVar(vet_Inx, vet_Count, data);
		_dataVector_f vet_tmp(data, data + nLen);//转存
		if (fscale != 1.0f || foffset != 0.0f)
		{
			int n = 0;
			for (auto it : vet_tmp)
			{
				vet_tmp[n] = it * fscale + foffset;
				n++;
			}
		}
		vet_data.swap(vet_tmp);
		delete[]data;
		
	}
	break;
	case 4://4维
	{
		long nLen = 1;
		if (l0 == -1)
		{
			nLen *= p[0];
			lg0 = p[0];
			vet_Inx.push_back(0);
			vet_Count.push_back(lg0);
		}
		else
		{
			vet_Inx.push_back(l0);
			vet_Count.push_back(1);
		}
		if (l1 == -1)
		{
			nLen *= p[1];
			lg1 = p[1];
			vet_Inx.push_back(0);
			vet_Count.push_back(lg1);
		}
		else
		{
			vet_Inx.push_back(l1);
			vet_Count.push_back(1);
		}
		if (l2 == -1)
		{
			nLen *= p[2];
			lg2 = p[2];
			vet_Inx.push_back(0);
			vet_Count.push_back(lg2);
		}
		else
		{
			vet_Inx.push_back(l2);
			vet_Count.push_back(1);
		}
		if (l3 == -1)
		{
			nLen *= p[3];
			lg3 = p[3];
			vet_Inx.push_back(0);
			vet_Count.push_back(lg3);
		}
		else
		{
			vet_Inx.push_back(l3);
			vet_Count.push_back(1);
		}
 
		//查看压缩值
		float fscale = 1.0f;
		float foffset = 0.0f;
 
		if (map_atts.find("scale_factor") != map_atts.end())
		{
			NcVarAtt AttT = pVar.getAtt("scale_factor");
			if (!AttT.isNull())
			{
				NcType TypeId = AttT.getType();
 
				if (TypeId == NC_FLOAT || TypeId == NC_DOUBLE)
					AttT.getValues(&fscale);
			}
		}
 
		if (map_atts.find("add_offset") != map_atts.end())
		{
			NcVarAtt AttS = pVar.getAtt("add_offset");
			if (!AttS.isNull())
			{
				NcType TypeId = AttS.getType();
 
				if (TypeId == NC_FLOAT || TypeId == NC_DOUBLE)
					AttS.getValues(&foffset);
			}
		}
		//默认填充值
		float fFillVaue = 0.0f;
		if (map_atts.find("_FillValue") != map_atts.end())
		{
			NcVarAtt AttF = pVar.getAtt("_FillValue");
			if (!AttF.isNull())
			{
				NcType TypeId = AttF.getType();
 
				if (TypeId == NC_FLOAT || TypeId == NC_DOUBLE || TypeId == NC_SHORT)
					AttF.getValues(&fFillVaue);
			}
		}
		float* data = new float[nLen];
		pVar.getVar(vet_Inx, vet_Count, data);
		_dataVector_f vet_tmp(data, data + nLen);//转存
 
		int n = 0;
		for (auto it : vet_tmp)
		{
			if (fabs(it - fFillVaue) < 0.000001)
			{
				//not vaild value
				vet_tmp[n] = 9999;
			}
			else if (fscale != 1.0f || foffset != 0.0f)
			{
				vet_tmp[n] = it * fscale + foffset;
			}
			n++;
		}
 
		vet_data.swap(vet_tmp);
		delete[]data;
 
		
	}
	break;
	case 5://5维
	{	
		long nLen = 1;
		if (l0 == -1)
		{
			nLen *= p[0];
			lg0 = p[0];
			vet_Inx.push_back(0);
			vet_Count.push_back(lg0);
		}
		else
		{
			vet_Inx.push_back(l0);
			vet_Count.push_back(1);
		}
		if (l1 == -1)
		{
			nLen *= p[1];
			lg1 = p[1];
			vet_Inx.push_back(0);
			vet_Count.push_back(lg1);
		}
		else
		{
			vet_Inx.push_back(l1);
			vet_Count.push_back(1);
		}
		if (l2 == -1)
		{
			nLen *= p[2];
			lg2 = p[2];
			vet_Inx.push_back(0);
			vet_Count.push_back(lg2);
		}
		else
		{
			vet_Inx.push_back(l2);
			vet_Count.push_back(1);
		}
		if (l3 == -1)
		{
			nLen *= p[3];
			lg3 = p[3];
			vet_Inx.push_back(0);
			vet_Count.push_back(lg3);
		}
		else
		{
			vet_Inx.push_back(l3);
			vet_Count.push_back(1);
		}
		if (l4 == -1)
		{
			nLen *= p[4];
			lg4 = p[4];
			vet_Inx.push_back(0);
			vet_Count.push_back(lg4);
		}
		else
		{
			vet_Inx.push_back(l4);
			vet_Count.push_back(1);
		}
 
		float* data = new float[nLen];
		pVar.getVar(vet_Inx, vet_Count, data);
		_dataVector_f vet_tmp(data, data + nLen);
		vet_data.swap(vet_tmp);
		delete[]data;
 
		
	}
	break;
	default:
		break;
	}
	return true;
}
 
long* ncReader::GetEleEdge(QString strElement)
{
	long *p = NULL;
	if (m_pDataFile->isNull() ||!m_pDataFile)
		return p;
 
	NcVar pVar = m_pDataFile->getVar(strElement.toStdString().c_str());
	if (pVar.isNull())
		return p;
 
	int nLen = pVar.getDimCount();
	if (nLen <= 0)
		return p;
 
	p = new long[nLen];
 
	for (int n = 0; n < nLen; n++)
	{
		int nSize = pVar.getDim(n).getSize();
		p[n] = nSize;
	}
	return p;
}
 
NcVar* ncReader::GetVar(QString strEle)
{
	if (m_pDataFile)
		return &(m_pDataFile->getVar(strEle.toStdString().c_str()));
	return nullptr;
}
 
QString ncReader::getfilePath()
{
	return curFilePath;
}
 
int ncReader::GetVarNums()
{
	if (m_pDataFile)
		return m_pDataFile->getDimCount();
 
	return 0;
}
 
void ncReader::GetVars(_dataVector_s &vet_Vars)
{
	if (!m_pDataFile)
		return;
	vet_Vars.clear();
	std::multimap<std::string, NcDim> dims = m_pDataFile->getDims();
 
	int nIndex = 0;
	for (auto it : dims)
	{
		vet_Vars.push_back(QString::fromStdString(it.first));
		nIndex++;
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/559923.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Zabbix 监控软件(一)

通常我们服务搭建成功 但不清楚服务器的运行状况&#xff0c;这时候就需要会使用监控系统查看服务器状态以及网站流量指标&#xff0c;利用监控系统的数据去了解上线发布的结果&#xff0c;和网站的健康状态。 利用一个优秀的监控软件&#xff0c;我们可以: ●通过一个友好的界…

互联网技术知识点总览——操作系统知识点框架图

简介 本文对操作系统的知识点整体框架进行梳理和分享如下&#xff1a;

智能生活新体验:小米香薰加湿器技术解码

在现代家居生活中&#xff0c;科技与舒适性日益交织&#xff0c;智能家居产品成为提升生活品质的重要工具。小米香薰加湿器作为一款集科技与生活美学于一体的产品&#xff0c;其独特的设计和多功能性受到了广泛欢迎。今天&#xff0c;我们就来详细拆解这款融合了科技与香薰元素…

如何搭建线下陪玩系统(本地伴游、多玩圈子)APP小程序H5多端前后端源码交付,支持二开!

一、卡顿的优化方法 1、对陪玩系统源码中流媒体传输的上行进行优化&#xff0c;通过提升推流端的设备性能配置、推流边缘CDN节点就近选择等方式解决音视频数据源流的卡顿。 2、对陪玩系统源码中音视频数据的下载链路进行优化&#xff0c;通过选择更近更优质的CDN边缘节点来减少…

OpenHarmony实战开发-如何实现发布图片评论功能。

介绍 本示例将通过发布图片评论场景&#xff0c;介绍如何使用startAbilityForResult接口拉起相机拍照&#xff0c;并获取相机返回的数据。 效果图预览 使用说明 通过startAbilityForResult接口拉起相机&#xff0c;拍照后获取图片地址。 实现思路 1.创建CommentData类&…

Docker Desktop打开一直转圈的解决办法

安装Docker Desktop之前确保你的Hyper-V已经打开 开启后需要重新安装重新安装重新安装这是最关键的一步&#xff0c;博主自己看了很多教程&#xff0c;最后试着重装了一下解决了 安装DockerDesktop的时候我的电脑根本就没有Hyper-V这个功能选项&#xff0c;可能是这个问题 如…

RLHF强化学习对其算法:PPO、DPO、ORPO

参考&#xff1a; https://blog.csdn.net/baoyan2015/article/details/135287298 https://cloud.tencent.com/developer/article/2409553 最新的llama3是PPO、DPO两种方法使用 人类反馈强化学习 (RLHF)&#xff0c;它利用人类偏好和指导来训练和改进机器学习模型&#xff1a; …

ColBERT和ColBERTv2:兼具Bi-encoder和cross-encoder优势的多向量排序模型

文章目录 简介ColBERTColBert 原理ColBERT如何训练ColBERT 如何使用离线索引用ColBERT 实现top-k Re-ranking用ColBERT 实现top-k 端到端的检索 ColBERTv2ColBERTv2原理SupervisionRepresentation IndexingRetrieval 总结参考资料 简介 ColBERT是一种多向量排序模型&#xff0…

centos7安装mysql5.7笔记

1 配置yum仓库 1.1更新密钥 #更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 1.2 下载使用wget命令下载MySQL的repo文件 #下载使用wget命令下载MySQL的repo文件 wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm 2 使用…

我为什么想成为一名程序员

#为什么你选择成为一名程序员# 目录 原因&#xff1a; 后续选择&#xff1a; 结尾&#xff1a; 原因&#xff1a; 本人是一个00后&#xff0c;出生在农村当时经济相对来说比较落后&#xff0c;村里面基本上都没几个人有手机。当时有些小伙伴他们拿着自己大人的手机在那里玩…

CS61B sp21fall Project02 Gitlet

Project02 Gitlet 一、项目简介二、Git和Gitlet2.1 Git简介2.2 Gitlet简介 三、框架设计3.1 Blobs3.2 Trees3.3 Commits 四、.Gitlet文件结构设计4.1 .git文件架构4.1.1 重点介绍index&#xff08;VSCode中无法查看&#xff0c;会乱码&#xff09;objects&#xff08;VSCode中无…

Navicat导入sql文件图文教程

本文使用的MySQL工具为:Navicat.默认已经连接数据库!! 步骤: 1.右键自己的数据库,选择新建数据库. 2.输入数据库名称&#xff0c;字符集选择“utf8”&#xff0c;排序规则选择“ utf8_general_ci”,确定. 3.双击新建好的“数据库”。右键点击“运行SQL文件”。 4.选择本地的s…

2024年安装tf tfa tfh

目的&#xff1a; 在win10上&#xff0c;anaconda内&#xff0c;同时安装tensorflow tensorflow_hub tensorflow_addons。需要注意3个版本相互对应。 本文最后找到一种方法&#xff1a;先用pip安装tensorflow2.14版本&#xff0c;再次使用pip安装剩余两个时&#xff0c;就会自…

姑苏寻韵~庆开放原子开源大赛 OpenTiny 前端 Web 应用开发挑战赛路演圆满落幕。

春日已至&#xff0c;姑苏古城迎来了一场编程的盛宴——开放原子开源大赛OpenTiny前端Web应用开发挑战赛。历时三个月的激烈角逐&#xff0c;OpenTiny与众多开发者携手共赴这场智慧的较量。决赛路演于4月14日在苏州&#xff08;太湖&#xff09;产业软件园圆满落下帷幕~ 开放原…

圣地亚哥 Toler 小学利用School AI帮助每个学生都有自己的聊天机器人,提高学习兴趣和效率

圣地亚哥 Toler 小学利用 AI 程序 SchoolAI 平台为学生创建个性化的聊天机器人&#xff0c;帮助他们更好地学习和提问。这个 AI 程序让学生可以在几秒钟内得到问题的答案&#xff0c;激发了他们提出更多问题的好奇心。 管理、调节和指导学生如何通过任务控制使用人工智能。 当…

JUC(java.util.concurrent) 的常见类

Callable 接口 Callable 的用法 Callable 是一个 interface&#xff08;类似之前的 Runnable&#xff0c;用来描述一个任务&#xff0c;但是没有返回值&#xff09;也是描述一个任务的&#xff0c;有返回值。方便程序猿借助多线程的方式计算结果. 例如&#xff1a;创建线程…

CZT Blusetein‘s FFT

参考文献&#xff1a; [Sto66] Stockham Jr T G. High-speed convolution and correlation[C]//Proceedings of the April 26-28, 1966, Spring joint computer conference. 1966: 229-233.[Blu68] Bluestein L. A linear filtering approach to the computation of discrete …

代码优化实践之税率计算问题

开篇 今天的问题来自于《编程珠玑》第三章【数据决定程序结构】&#xff0c;这里提出了几条代码优化相关的原则&#xff0c;受益不浅。下面是提到的几条原则&#xff1a; 使用数组重新编写重复代码。冗长的相似代码往往可以使用最简单的数据结构——数组来更好的表述&#xff1…

Vue3: toRefs与toRef的基本使用

一、前言 本文主要介绍toRefs与toRef的基本使用。 二、内容 1、基本概念 作用: toRefs与toRef可以将一个响应式对象中的每一 个属性&#xff0c;转换为ref对象&#xff1b;不同 toRefs与toRef功能一致&#xff0c;但toRefs可以批量转换。 2、toRefs 如果把reactive定义的…

ROS仿真小车(四)—— URDF与Gazebo集成

文章目录 前言一、ubuntu20.04中下载gazebo_models二、在gazebo中显示简单模型1 创建功能包&#xff0c;导入依赖2 编写URDF文件3 编写launch文件4 在gazebo中显示机器人模型 三、URDF集成Gazebo相关设置四、在gazebo中导入小车模型1 编写xacro文件2 编写launch文件3 运行结果 …
最新文章