当前位置: 首页 > news >正文

C#调用Lua

目录

xLua导入

 打包工具导入

 单例基类导入与AB包管理器导入

Lua解析器

文件加载与重定向

Lua解析器管理器

全局变量获取

全局函数获取

对于无参数无返回值

 对于有参数有返回值

 对于多返回值

 对于变长参数

完整代码 

List与Dictionary映射Table

类映射Table

接口映射Table

LuaTable映射Table

xLua导入

在github上搜索xLua,选择第一个下载,进入master的Assets里面导入

 导入后可以在工具栏中看到XLua,这样导入就完成了。

 打包工具导入

这里上篇中有讲,可以看一下 https://blog.csdn.net/sara_shengxin/article/details/144596428?spm=1001.2014.3001.5502

 单例基类导入与AB包管理器导入

 获取链接http://通过网盘分享的文件:Base.rar 链接: https://pan.baidu.com/s/1-WpLVyrRFowVAs1AudrbdQ?pwd=raux 提取码: raux

AB包管理器导入,在上一篇中最终的代码复制过来就可以ABMgr

Lua解析器

 构建一个lua解析器,使得能够在unity中执行lua语言,提供的方法主要有:DoString(),Tick(),Dispose().此时调用lua脚本我们要将他放在Resources文件夹里面,且要修改lua脚本的后缀为.txt

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//引入命名空间
using XLua;
public class Lesson1LuaEnv : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){//lua解析器 能够在Unity中执行lua语言LuaEnv env= new LuaEnv();//执行Lua语言env.DoString("print('nihao')");//执行一个lua脚本 ,利用lua中的多脚本执行requireenv.DoString("require('Main')");//默认脚本加载路径在resource中并且后缀为.txt//帮助清除Lua中我们没有手动清除的对象,垃圾回收//帧更新中定时执行 或者切场景的时候执行env.Tick();//销毁Lua解析器env.Dispose();}// Update is called once per framevoid Update(){}
}

 在lua的Main脚本中,我们这样写

print("主lua脚本启动")

文件加载与重定向

 上面所说的加载lua脚本的方法虽然可行,但是比较麻烦。我们还可以利用XLua中提供的一个重定向的方法AddLoader(),允许我们自定义加载lua的方法

using System.IO;
using UnityEngine;
using XLua;public class Lesson2Loader : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){LuaEnv env = new LuaEnv();//xlua提供一个路径重定向的方法//允许我们自定义加载lua文件的规则//当我们执行lua语言 require时,相当于执行一个lua脚本//他会执行我们自定义传入的这个函数env.AddLoader(MyCustomLoader);env.DoString("require('Main')");}// Update is called once per framevoid Update(){}//自动执行private byte[] MyCustomLoader(ref string filepath){//通过函数中的逻辑加载lua文件//传入的参数是require执行lua脚本文件名//拼接一个lua文件所在的路径string path =Application.dataPath+"/LUA/"+filepath+".lua";Debug.Log(path);//有路径就去加载文件//File知识点 C#提供的文件读写的类//判断文件是否存在if(File.Exists(path)){return File.ReadAllBytes(path);}else{Debug.Log("文件不存在"+filepath);}return null;}
}

 使用require("lua脚本")的方法会先去自定义的函数里面找文件,如果找到则返回,找不到会在默认路径里面寻找

Lua解析器管理器

 有了上面的经验,我们可以创建一个lua管理器,为C#解析lua提供一些通用的方法

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.Rendering.VirtualTexturing;
using XLua;
/// <summary>
/// lua管理器
/// 提供lua解析器
/// 保证解析器唯一性
/// 提供通用的方法
/// </summary>
public class LuaMgr:BaseManager<LuaMgr>
{//执行lua语言的函数//释放垃圾//重定向//销毁private LuaEnv luaenv;/// <summary>/// 得到lua中的_G/// </summary>public LuaTable Global{get{return luaenv.Global;}}/// <summary>/// 初始化/// </summary>public void Init(){if (luaenv != null)return;luaenv = new LuaEnv();//重定向luaenv.AddLoader(MyCustomLoader);luaenv.AddLoader(MyCustomLoaderAB);}//自动执行private byte[] MyCustomLoader(ref string filepath){//通过函数中的逻辑加载lua文件//传入的参数是require执行lua脚本文件名//拼接一个lua文件所在的路径string path = Application.dataPath + "/LUA/" + filepath + ".lua";//有路径就去加载文件//File知识点 C#提供的文件读写的类//判断文件是否存在if (File.Exists(path)){return File.ReadAllBytes(path);}else{Debug.Log("文件不存在" + filepath);}return null;}//Lua脚本会放在AB包中//最终我们会通过加载AB包再加载其中的Lua脚本资源来执行//AB包中如果要加载文本,后缀还是会有限制 .lua不能被识别//打包时还是要把lua文件后缀改为txt//重定向加载AB中的lua脚本private byte[] MyCustomLoaderAB(ref string filepath){Debug.Log("进入AB包加载");从AB包中加载Lua文件加载AB包//string path = Application.streamingAssetsPath + "/LUA";//AssetBundle ab=AssetBundle.LoadFromFile(path);加载Lua文件,返回//TextAsset tx = ab.LoadAsset<TextAsset>(filepath + ".lua");加载lua文件里的byte数组//return tx.bytes;//通过AB包管理器加载的lua脚本TextAsset lua =ABgr.GetInstance().LoadRes<TextAsset>("LUA", filepath + ".lua");if (lua != null){return lua.bytes;}else{Debug.Log("重定向失败"+filepath);}return null;}/// <summary>/// 传入lua文件名,执行lua脚本/// </summary>/// <param name="filename"></param>public void DoLuaFile(string filename){string s = string.Format("require('{0}')", filename);DoString(s);}/// <summary>/// 执行lua语言/// </summary>/// <param name="s"></param>public void DoString(string s){if(luaenv == null){Debug.Log("解析器未初始化");return;}luaenv.DoString(s);}/// <summary>/// 释放垃圾/// </summary>public void Tick(){if (luaenv == null){Debug.Log("解析器未初始化");return;}luaenv.Tick();}/// <summary>/// 销毁/// </summary>public void Dispose(){if (luaenv == null){Debug.Log("解析器未初始化");return;}luaenv.Dispose();luaenv= null;}}

全局变量获取

 我们修改lua中Main脚本的内容

print("主lua脚本启动")
--Unity中写lua执行
--xlua帮我们处理
--只要是执行lua脚本都会自动进入我们的重定向函数中找文件
require("Test")

然后我们在test脚本中声明一些变量,必须是全局变量,因为通过C#不能获取Lua中的本地变量

testnum=1
testbool=true
testfloat=11.8
teststring="xxxx"

 然后我们通过Global属性,利用Get获取,如果我们要修改值的内容,利用Set进行修改。如果直接修改是不能改变lua中的内容的,因为是浅拷贝

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Lesson4CallVarlable : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){LuaMgr.GetInstance().Init();LuaMgr.GetInstance().DoLuaFile("Main");//使用lua解析器中的luaenv中的Global属性//获取int i=LuaMgr.GetInstance().Global.Get<int>("testnum");Debug.Log(i);//该值LuaMgr.GetInstance().Global.Set("testnum",100);int i2 = LuaMgr.GetInstance().Global.Get<int>("testnum");Debug.Log(i2);//不能获取lua中的本地局部变量//int test=LuaMgr.GetInstance().Global.Get<int>("test");//Debug.Log(test);}// Update is called once per framevoid Update(){}
}

全局函数获取

 在获取全局函数时,我们有四种类型的函数:无参数无返回值,有参数有返回值,多返回值,变长参数。

对于无参数无返回值

我们有四种方式获取:

//声明一个无参数无返回值的委托
public delegate void CallNoReturn();//start中调用CallNoReturn callNoReturn = LuaMgr.GetInstance().Global.Get<CallNoReturn>("testFun");
callNoReturn();//Unity自带的委托(无返回值)
UnityAction ua= LuaMgr.GetInstance().Global.Get<UnityAction>("testFun");
ua();//C#的委托(无返回值)
Action action = LuaMgr.GetInstance().Global.Get<Action>("testFun");
action();//xLua 提供的一种获取函数的方式(尽量少用,会产生一些垃圾)
LuaFunction lf= LuaMgr.GetInstance().Global.Get<LuaFunction>("testFun");
lf.Call();
--无参无返回
testFun=function (  )print("无参数无返回")
end

 对于有参数有返回值

也是类似的:其中要注意的时,由于必须添加[CSharpCallLua],因此要在Xlua中先清除生成代码,再生成代码,然后再运行

/声明一个有参数有返回值的委托
//该特性是在xlua命名空间中的
[CSharpCallLua]
public delegate int CallHaveReturn(int a);//start中调用
CallHaveReturn callHaveReturn = LuaMgr.GetInstance().Global.Get<CallHaveReturn>("testFunc");
Debug.Log("有参有返回"+callHaveReturn(8));Func<int,int> func = LuaMgr.GetInstance().Global.Get<Func<int, int>>("testFunc");
Debug.Log(func(5));LuaFunction lf1 = LuaMgr.GetInstance().Global.Get<LuaFunction>("testFunc");
Debug.Log(lf1.Call(19)[0]);//一个返回值返回数组第0个
--有参有返回
testFunc=function ( a)print("有参数有返回值")return a+4end

 对于多返回值

我们使用out或者ref来接收,他们两个类似,区别为使用out不需要初始化,使用ref需要为他初始化

同样保存后也需要在XLua中重新生成代码再运行

我们还可以使用LuaFunction,使用数组来存他的多个返回值然后再遍历输出

//声明一个多返回值的委托 用out
[CSharpCallLua]
public delegate int CallMutReturn(int a, out int b, out bool c, out float d);//声明一个多返回值的委托 用ref
[CSharpCallLua]
public delegate int CallMutReturn1(int a, ref int b, ref bool c, ref float d);CallMutReturn callMutReturn = LuaMgr.GetInstance().Global.Get<CallMutReturn>("testFunc3");
int b;
bool c;
float d;
Debug.Log("第一个返回值" + callMutReturn(123,out b,out c,out d));
Debug.Log(b+"_"+c+"_"+d);CallMutReturn1 callMutReturn1 = LuaMgr.GetInstance().Global.Get<CallMutReturn1>("testFunc3");
int b1=0;
bool c1=false;
float d1=0.0f;
Debug.Log("第一个返回值" + callMutReturn1(100, ref b1, ref c1, ref d1));
Debug.Log(b1 + "_" + c1 + "_" + d1);//使用luaFunction
LuaFunction lf2 = LuaMgr.GetInstance().Global.Get<LuaFunction>("testFunc3");
object[] obj = lf2.Call(10);
for(int i = 0; i < obj.Length; i++){Debug.Log("第"+i+"个返回值是"+obj[i]);}

 对于变长参数

我们使用自定义的一个委托,变长参数我们使用params,如果能确定是同一类型,后面可以使用该类型,如果有各种类型就使用object

//声明一个变长参数的委托
[CSharpCallLua]
public delegate void CallChange(int a,params object[] obj);CallChange callChange = LuaMgr.GetInstance().Global.Get<CallChange>("testFunc4");
callChange(3,false,"jwhdkh",7.666,658);LuaFunction lf3 = LuaMgr.GetInstance().Global.Get<LuaFunction>("testFunc4");
lf3.Call(2, false, "jwhdkh", 7.666, 658);
--变长参数
testFunc4=function ( a,... )print("变长参数")print(a)arg={...}for k,v in pairs(arg) doprint(k,v)end
end

完整代码 

using System;
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.Events;
using XLua;//声明一个无参数无返回值的委托
public delegate void CallNoReturn();//声明一个有参数有返回值的委托
//该特性是在xlua命名空间中的
[CSharpCallLua]
public delegate int CallHaveReturn(int a);//声明一个多返回值的委托 用out
[CSharpCallLua]
public delegate int CallMutReturn(int a, out int b, out bool c, out float d);//声明一个多返回值的委托 用ref
[CSharpCallLua]
public delegate int CallMutReturn1(int a, ref int b, ref bool c, ref float d);//声明一个变长参数的委托
[CSharpCallLua]
public delegate void CallChange(int a,params object[] obj);//如果lua中后面的变长数组全是int或者是一种类型,那么可以就写params int[] b或者params string[] c
public class Lesson5CallFunction : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){LuaMgr.GetInstance().Init();LuaMgr.GetInstance().DoLuaFile("Main");无参无返回的获取//委托CallNoReturn callNoReturn = LuaMgr.GetInstance().Global.Get<CallNoReturn>("testFun");callNoReturn();//Unity自带的委托(无返回值)UnityAction ua= LuaMgr.GetInstance().Global.Get<UnityAction>("testFun");ua();//C#的委托(无返回值)Action action = LuaMgr.GetInstance().Global.Get<Action>("testFun");action();//xLua 提供的一种获取函数的方式(尽量少用,会产生一些垃圾)LuaFunction lf= LuaMgr.GetInstance().Global.Get<LuaFunction>("testFun");lf.Call();//有参有返回CallHaveReturn callHaveReturn = LuaMgr.GetInstance().Global.Get<CallHaveReturn>("testFunc");Debug.Log("有参有返回"+callHaveReturn(8));Func<int,int> func = LuaMgr.GetInstance().Global.Get<Func<int, int>>("testFunc");Debug.Log(func(5));LuaFunction lf1 = LuaMgr.GetInstance().Global.Get<LuaFunction>("testFunc");Debug.Log(lf1.Call(19)[0]);//一个返回值返回数组第0个///多返回值//使用out与ref来接收(out接收外面的值不需要初始化,ref需要初始化)CallMutReturn callMutReturn = LuaMgr.GetInstance().Global.Get<CallMutReturn>("testFunc3");int b;bool c;float d;Debug.Log("第一个返回值" + callMutReturn(123,out b,out c,out d));Debug.Log(b+"_"+c+"_"+d);CallMutReturn1 callMutReturn1 = LuaMgr.GetInstance().Global.Get<CallMutReturn1>("testFunc3");int b1=0;bool c1=false;float d1=0.0f;Debug.Log("第一个返回值" + callMutReturn1(100, ref b1, ref c1, ref d1));Debug.Log(b1 + "_" + c1 + "_" + d1);//使用luaFunctionLuaFunction lf2 = LuaMgr.GetInstance().Global.Get<LuaFunction>("testFunc3");object[] obj = lf2.Call(10);for(int i = 0; i < obj.Length; i++){Debug.Log("第"+i+"个返回值是"+obj[i]);}变长参数CallChange callChange = LuaMgr.GetInstance().Global.Get<CallChange>("testFunc4");callChange(3,false,"jwhdkh",7.666,658);LuaFunction lf3 = LuaMgr.GetInstance().Global.Get<LuaFunction>("testFunc4");lf3.Call(2, false, "jwhdkh", 7.666, 658);}}

List与Dictionary映射Table

 我们在lua中分别创建一个同类型与不同类型的列表与字典,列表一般用来没有自定义索引的表,如果确定类型就用指定类型,如果不确定就用object。字典一般是用来有自定义索引的表,如果确定类型就用指定类型,如果不确定就用object。

--List
testlist ={1,2,3,4,5,6}
testlist2={"vv",4,34,true,4.68}--Dictionary
testDic={["1"]=1,["2"]=2,["3"]=3,["4"]=4,["5"]=5
}
testDic2={["1"]=1,[true]=2,[false]=true,["4"]=4.5,["5"]=false
}

 注意:遍历列表时用for,遍历字典时我们使用的时foreach。并且无论是字典还是列表,都为浅拷贝。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Lesson6CallListDic : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){LuaMgr.GetInstance().Init();LuaMgr.GetInstance().DoLuaFile("Main");//同一类型 ListList<int> list = LuaMgr.GetInstance().Global.Get<List<int>>("testlist");Debug.Log("*********************List**********************");for(int i = 0; i < list.Count; i++){Debug.Log(list[i]);}//为值拷贝 浅拷贝,不会改变lua中的值//list[0] = 100;//List<int> list2 = LuaMgr.GetInstance().Global.Get<List<int>>("testlist");//for (int i = 0; i < list.Count; i++)//{//    Debug.Log(list2[i]);//}//不指定类型 ListList<object> list3= LuaMgr.GetInstance().Global.Get<List<object>>("testlist2");for (int i = 0; i < list3.Count; i++){Debug.Log(list3[i]);}Debug.Log("*********************Dic**********************");//同一类型 DicDictionary<string,int> dic1= LuaMgr.GetInstance().Global.Get<Dictionary<string,int>>("testDic");foreach(string item in dic1.Keys){Debug.Log(item + "_" + dic1[item]);}//若直接修改值,也为浅拷贝//不同类型 DicDictionary<object, object> dic2 = LuaMgr.GetInstance().Global.Get<Dictionary<object, object>>("testDic2");foreach (object item in dic2.Keys){Debug.Log(item + "_" + dic2[item]);}}// Update is called once per framevoid Update(){}
}

类映射Table

 lua中没有类,用表自定义类

testClass={testint=5,testbool=true,testfloat=4.5,teststring="xnbsa",testFun=function (  )print("243566764")endtestInClass={testInInt=66,testInString=("*****************这是一个嵌套表******************")}
}

 在C#中,我们也定义一个类,其中声明的成员变量名字要和lua中一致,数量可以多也可以少。类中的嵌套在C#上的表现也是再声明一个类,其中的成员变量与函数名也要相同。

其中,在类中的拷贝为深拷贝,在C#中修改值会同步修改lua中的值

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;public class CallLuaClass
{//在类中声明成员变量 名字要和lua中的一样//数量可以比lua中多也可以更少public int testint;public float testfloat;public bool testbool;public string teststring;public UnityAction testFun;public CallLuaInClass testInClass;
}public class CallLuaInClass
{public int testInInt;public string testInString;
}
public class Lesson7CallClass : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){LuaMgr.GetInstance().Init();LuaMgr.GetInstance().DoLuaFile("Main");CallLuaClass obj = LuaMgr.GetInstance().Global.Get<CallLuaClass>("testClass");Debug.Log(obj.testint);Debug.Log(obj.testfloat);Debug.Log(obj.testbool);//Debug.Log(obj.teststring);//obj.testFun();Debug.Log(obj.testInClass.testInInt);Debug.Log(obj.testInClass.testInString);//浅拷贝//obj.testint = 999;//CallLuaClass obj1 = LuaMgr.GetInstance().Global.Get<CallLuaClass>("testClass");//Debug.Log(obj1.testint);}// Update is called once per framevoid Update(){}
}

接口映射Table

 lua中的脚本我们继续使用类的代码

testClass={testint=5,testbool=true,testfloat=4.5,teststring="xnbsa",testFun=function (  )print("243566764")end
}

 但是在C#中,接口是不允许有成员变量的,我们要使用属性来接收lua中的变量。

由于我们要使用[CSharpCallLua],在每一次对接口进行修改后我们都需要在XLua中进行清空然后生成代码再运行。

接口也可以有嵌套,嵌套方式与类中相似

注意的是接口中的拷贝也为深拷贝

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using XLua;[CSharpCallLua]
//接口中是不允许有成员变量,因此我们用属性来接收
//与类相似,内容属性可多可少,但是每一次修改interface结构后都需要先清空xLua再生成运行
//嵌套几乎和类一样,无非就是要遵循接口的规则
public interface ICCallLua
{int testint{get; set;}bool testbool{get; set;}float testfloat{get; set;}string teststring{get; set;}UnityAction testFun{get; set;}
}public class Lesson8CallInterface : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){LuaMgr.GetInstance().Init();LuaMgr.GetInstance().DoLuaFile("Main");ICCallLua obj = LuaMgr.GetInstance().Global.Get<ICCallLua>("testClass");Debug.Log(obj.testint);Debug.Log(obj.testbool);Debug.Log(obj.teststring);Debug.Log(obj.testfloat);obj.testFun();//接口为引用拷贝,改了值lua中的值也会变化obj.testint = 18888;ICCallLua obj1 = LuaMgr.GetInstance().Global.Get<ICCallLua>("testClass");Debug.Log(obj1.testint);}// Update is called once per framevoid Update(){}
}

LuaTable映射Table

 同样使用lua之前的代码

testClass={testint=5,testbool=true,testfloat=4.5,teststring="xnbsa",testFun=function (  )print("243566764")end
}

 在之前的使用中,我们多次用到LuaTable,在LuaMgr的定义中我们知道,他将其定义为Global,来得到Get里面的变量与函数

但是我们不建议使用LuaTable与LuaFunction,因为他们效率低且会产生垃圾,在不需要使用后要记得销毁

并且他也为深拷贝

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;public class Lesson9CallLuaTable : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){LuaMgr.GetInstance().Init();LuaMgr.GetInstance().DoLuaFile("Main");//不建议用LuaTable与LauFunction,因为效率低且容易产生垃圾//是一种引用对象LuaTable table=LuaMgr.GetInstance().Global.Get<LuaTable>("testClass");Debug.Log(table.Get<int>("testint"));Debug.Log(table.Get<bool>("testbool"));Debug.Log(table.Get<float>("testfloat"));Debug.Log(table.Get<string>("teststring"));table.Get<LuaFunction>("testFun").Call();//是引用拷贝table.Set("testint", 1949);Debug.Log(table.Get<int>("testint"));LuaTable table1 = LuaMgr.GetInstance().Global.Get<LuaTable>("testClass");Debug.Log(table1.Get<int>("testint"));//不用了要记得销毁,会有垃圾table.Dispose();table1.Dispose();}// Update is called once per framevoid Update(){}
}

相关文章:

C#调用Lua

目录 xLua导入 打包工具导入 单例基类导入与AB包管理器导入 Lua解析器 文件加载与重定向 Lua解析器管理器 全局变量获取 全局函数获取 对于无参数无返回值 对于有参数有返回值 对于多返回值 对于变长参数 完整代码 List与Dictionary映射Table 类映射Table 接口映射…...

LeetCode100之组合总和(39)--Java

1.问题描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复…...

NTN学习笔记之术语和缩写词解析

去发现&#xff0c;去努力&#xff0c;去表达。 参考&#xff1a;3GPP TR 38.811&#xff08;R15&#xff09;&#xff0c;TR 38.821&#xff08;R16&#xff09; 目录 0. NTN典型架构图1. 术语2. 缩写 0. NTN典型架构图 为了方便对术语场景的理解&#xff0c;先放上两张NTN典…...

Yolo11改进:注意力改进|Block改进|ESSAformer,用于高光谱图像超分辨率的高效Transformer|即插即用

摘要 一、论文介绍 高光谱图像超分辨率的重要性:高光谱成像技术通过密集采样光谱特征,为材料区分提供丰富的光谱和空间结构信息,广泛应用于各领域。高光谱图像超分辨率(HSI-SR)旨在从低分辨率HSI生成高分辨率HSI。传统方法的局限性:传统方法依赖手工制作的先验,如低秩近…...

STM32 单片机 练习项目 LED灯闪烁LED流水灯蜂鸣器 未完待续

个人学习笔记 文件路径&#xff1a;程序源码\STM32Project-DAP&DAPmini\1-1 接线图 3-1LED闪烁图片 新建项目 新建项目文件 选择F103C8芯片 关闭弹出窗口 拷贝资料 在项目内新建3个文件夹 Start、Library、User Start文件拷贝 从资料中拷贝文件 文件路径&#xff1a;固…...

使用PyTorch实现基于稀疏编码的生成对抗网络(GAN)在CIFAR-10数据集上的应用

使用PyTorch实现基于稀疏编码的生成对抗网络(GAN)在CIFAR-10数据集上的应用 目录 使用PyTorch实现基于稀疏编码的生成对抗网络(GAN)在CIFAR-10数据集上的应用1. 引言2. 数据集介绍3. 模型网络结构3.1 网络结构3.2 编码器3.3 生成器3.4 判别器4. 模型优化器与损失函数4.1 优…...

用matlab调用realterm一次性发送16进制数

realterm采用PutString接口进行发送&#xff0c;需要注意的是发送的16进制数前面要加入0x标志。只有这样&#xff0c;realterm才能将输入的字符串识别为16进制数的形式。 另外,PutString函数支持两个参数输入&#xff0c;第一个参数为字符串&#xff0c;第二个参数为发送形式&…...

通过可穿戴外骨骼,以更灵活的方式操作你的机器人。

今天&#xff0c;我们将介绍一款专为控制 Mercury X1 和 Mercury B1 机械臂而设计的创新外骨骼。这种外骨骼以人类手臂的结构为蓝本&#xff0c;可实现直观和精确的控制。 开发这种外骨骼的动机源于人们对深度学习和机器学习等领域日益增长的兴趣。这些技术使机器人能够自主学习…...

记录将springboot的jar包和lib分离,使用docker-compose部署

本文讲诉如何把jar里的lib依赖包独立出来&#xff0c;方便更新服务时&#xff0c;缩小jar的体积&#xff0c;下面以若依的system服务为例&#xff0c;配置中的路径请酌情修改&#xff0c;主要提供大致配置逻辑 第一步&#xff1a;修改项目的pom.xml&#xff0c;调整build的配…...

JavaScript 延迟加载的方法

延迟加载&#xff08;Lazy Loading&#xff09;是一种优化网页性能的技术&#xff0c;它允许资源&#xff08;如图片、脚本等&#xff09;在需要时才被加载&#xff0c;而不是在页面初次加载时全部加载。这可以减少初始页面加载时间&#xff0c;提升用户体验&#xff0c;特别是…...

xrdp连接闪退情况之一

错误核查 首先使用命令vim ~/.xsession-errors&#xff0c;当里面的报错信息为WARNING **: Could not make bus activated clients aware of XDG_CURRENT_DESKTOPGNOME environment variable:Failed to execute child process “dbus-launch” (No such file or directory)&am…...

数据分析思维(八):分析方法——RFM分析方法

数据分析并非只是简单的数据分析工具三板斧——Excel、SQL、Python&#xff0c;更重要的是数据分析思维。没有数据分析思维和业务知识&#xff0c;就算拿到一堆数据&#xff0c;也不知道如何下手。 推荐书本《数据分析思维——分析方法和业务知识》&#xff0c;本文内容就是提取…...

WebRTC 在视频联网平台中的应用:开启实时通信新篇章

在当今这个以数字化为显著特征的时代浪潮之下&#xff0c;实时通信已然稳稳扎根于人们生活与工作的方方面面&#xff0c;成为了其中不可或缺的关键一环。回首日常生活&#xff0c;远程办公场景中的视频会议让分散各地的团队成员能够跨越地理距离的鸿沟&#xff0c;齐聚一堂共商…...

Vue3(elementPlus) el-table替换/隐藏行箭头,点击整行展开

element文档链接&#xff1a; https://element-plus.org/zh-CN/component/form.html 一、el-table表格行展开关闭箭头替换成加减号 注&#xff1a;Vue3在样式中修改箭头图标无效&#xff0c;可能我设置不对&#xff0c;欢迎各位来交流指导 转变思路&#xff1a;隐藏箭头&…...

oracle闪回恢复数据:(闪回查询,闪回表,闪回库,回收站恢复)

oracle的闪回查询&#xff0c;可以查询提交在表空间的闪回数据&#xff0c;并可以还原所查询的数据&#xff0c;用于恢复短时间内的delele 或者 update 误操作&#xff0c;非常方便&#xff0c;缺点是只能恢复大概几小时内的数据。 文章目录 概要闪回查询恢复数据的主要方法包括…...

C语言——结构体,位段,枚举和联合

目录 前言 结构体 1含义 2语法 3匿名结构体 4结构体自引用 5结构体的定义与初始化 6内存对齐 7修改对齐数 8结构体传参 位段 1含义 2位段的内存分配 ​编辑3位段的问题 4位段的应用 枚举 1含义 2定义 3枚举优点 4枚举使用 联合 1含义 2定义 3特点 4计…...

期末概率论总结提纲(仅适用于本校,看文中说明)

文章目录 说明A选择题1.硬币2.两个事件的关系 与或非3.概率和为14.概率密度 均匀分布5.联合分布率求未知参数6.联合分布率求未知参数7.什么是统计量&#xff08;记忆即可&#xff09;8.矩估计量9.117页12题10.显著水平阿尔法&#xff08;背公式就完了&#xff09; 判断题11.事件…...

Python视频处理:噪声矩阵与并行计算的完美融合

噪声级别对视频质量有显著的影响&#xff0c;主要体现在以下几个方面&#xff1a; 1. 视觉质量 低噪声级别&#xff1a;当噪声级别较低时&#xff0c;视频的视觉质量较好。噪声对图像细节的干扰较小&#xff0c;画面看起来较为清晰和自然。观众可以更容易地识别图像中的细节和…...

如何使用SparkSql

一、SparkSql的前世今生 Hive->Shark->Spark SQL 二、SparkSql依赖 <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.11</artifactId> <version>2.1.2</version> </dependency> 三、…...

YOLOv8实战人员跌倒检测

本文采用YOLOv8作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv8以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对人员跌倒目标数据集进行训练和优化&#xff0c;该数据集包含丰富人员跌倒图像样…...

华为云Flexus+DeepSeek征文 | 基于DeepSeek-V3构建企业知识库问答机器人实战

作者简介 我是摘星&#xff0c;一名专注于云计算和AI技术的开发者。本次通过华为云MaaS平台体验DeepSeek系列模型&#xff0c;将实际使用经验分享给大家&#xff0c;希望能帮助开发者快速掌握华为云AI服务的核心能力。 目录 作者简介 1. 引言 2. 技术选型与架构设计 2.1 技…...

JVM 核心概念深度解析

最近正在复习Java八股&#xff0c;所以会将一些热门的八股问题&#xff0c;结合ai与自身理解写成博客便于记忆 一、JVM内存结构/运行时数据区 JVM运行时数据区主要分为以下几个部分&#xff1a; 程序计数器(PC Register) 线程私有&#xff0c;记录当前线程执行的字节码行号唯…...

LeetCode--24.两两交换链表中的结点

解题思路&#xff1a; 1.获取信息&#xff1a; 给了一个链表&#xff0c;要求两两一组地交换位置 限定条件&#xff1a;只能进行结点交换&#xff0c;不能修改结点内部的值 额外条件&#xff1a;结点数在0-100的范围&#xff0c;闭区间 2.分析题目&#xff1a;…...

Java+Access综合测评系统源码分享:含论文、开题报告、任务书全套资料

JAVAaccess综合测评系统毕业设计 一、系统概述 本系统采用Java Swing开发前端界面&#xff0c;结合Access数据库实现数据存储&#xff0c;专为教育机构打造的综合测评解决方案。系统包含学生管理、题库管理、在线测评、成绩分析四大核心模块&#xff0c;实现了测评流程的全自…...

【Linux操作系统】基础开发工具(yum、vim、gcc/g++)

文章目录 Linux软件包管理器 - yumLinux下的三种安装方式什么是软件包认识Yum与RPMyum常用指令更新软件安装与卸载查找与搜索清理缓存与重建元数据 yum源更新1. 备份现有的 yum 源配置2. 下载新的 repo 文件3. 清理并重建缓存 Linux编辑器 - vim启动vimVim 的三种主要模式常用操…...

Flutter:下拉框选择

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/d4 b70dec92594838a8b2c130717938aa.png) 文档地址dropdown_button2 // 限价、市价 状态final List<String> orderTypes [普通委托, 市价委托];String? selectedOrderType 普通委托;changeOrderType(String …...

.NET 9中的异常处理性能提升分析:为什么过去慢,未来快

一、为什么要关注.NET异常处理的性能 随着现代云原生、高并发、分布式场景的大量普及&#xff0c;异常处理&#xff08;Exception Handling&#xff09;早已不再只是一个冷僻的代码路径。在高复杂度的微服务、网络服务、异步编程环境下&#xff0c;服务依赖的外部资源往往不可…...

【判断既约分数】2022-4-3

缘由既约分数&#xff0c;除了辗转相除法-编程语言-CSDN问答 void 判断既约分数() {int a 1, b 2020, aa b, y 2, gs 0;while (aa){while (a < b){while (y < a && y < aa)if (a%y 0 && aa%y 0)a, y 2;elsey;if (a < b)gs; else;a, y 2;…...

青少年编程与数学 01-011 系统软件简介 03 NetWare操作系统

青少年编程与数学 01-011 系统软件简介 03 NetWare操作系统 一、历史背景二、核心架构三、关键功能四、管理工具五、客户端支持六、版本演变七、衰落原因八、遗产与影响总结 摘要&#xff1a;NetWare 是早期网络操作系统的巅峰之作&#xff0c;其高性能文件服务、目录管理和容错…...

三维GIS开发cesium智慧地铁教程(4)城市白模加载与样式控制

一、添加3D瓦片 <!-- 核心依赖引入 --> <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"><!-- 模型数据路径 --> u…...