日撸Java三百行(day31:整数矩阵及其运算)

news2025/1/11 19:58:21

目录

前言

一、基本属性与方法

二、getter与setter方法

三、矩阵相加与矩阵相乘方法

1.矩阵相加

 2.矩阵相乘

四、数据测试

五、完整的程序代码

总结


前言

从今天开始,我们就要踏上图论的学习之路了。第一天,我们先简单热个身,构造一个整数矩阵。

一、基本属性与方法

    /**
	 * The data.
	 */
	int[][] data;

由于我们今天构造的是int类型的矩阵,而在程序代码中矩阵又是通过数组来实现,所以这里首先定义了一个int类型的二维数组。

    /**
	 *********************
	 * The first constructor.
	 * 
	 * @param paraRows The number of rows.
	 * @param paraColumns The number of columns.
	 *********************
	 */
	public IntMatrix(int paraRows, int paraColumns) {
		data = new int[paraRows][paraColumns];
	} // Of the first constructor

创建第一个构造方法,这其实就是我在日撸Java三百行(day07:矩阵元素相加)中所提到过的二维数组的动态初始化,paraRows代表该数组的行数,paraColumns代表该数组的列数。

    /**
	 *********************
	 * The second constructor. Construct a copy of the given matrix.
	 * 
	 * @param paraMatrix The given matrix.
	 *********************
	 */
	public IntMatrix(int[][] paraMatrix) {
		data = new int[paraMatrix.length][paraMatrix[0].length];

		// Copy elements.
		for (int i = 0; i < data.length; i++) {
			for (int j = 0; j < data[0].length; j++) {
				data[i][j] = paraMatrix[i][j];
			} // Of for j
		} // Of for i
	} // Of the second constructor

创建第二个构造方法,简单来说就是输入一个二维数组作为参数,再将其拷贝到我们所构造的数组。与日撸Java三百行(day07:矩阵元素相加)中矩阵所有元素求和的分析保持一致,这里的paraMatrix.length仍然代表数组paraMatrix的行数,paraMatrix[0].length则代表数组paraMatrix的列数;然后利用一个两层for循环,将参数数组paraMatrix中的元素一个一个拷贝到目标数组data中。

    /**
	 *********************
	 * The third constructor. Construct a copy of the given matrix.
	 * 
	 * @param paraMatrix The given matrix.
	 *********************
	 */
	public IntMatrix(IntMatrix paraMatrix) {
		this(paraMatrix.getData());
	} // Of the third constructor

创建第三个构造方法,与第二个构造方法不同的是,这里的参数不再是二维数组,而是同为IntMatrix类型的一个对象;然后,再利用this调用其他构造方法以减少代码冗余,调用的构造方法为getData(),具体的我们后面再说。本质上看,第三个构造方法其实与第二个构造差不多,都是通过拷贝输入的参数(数组或矩阵)进行构造。

    /**
	 *********************
	 * Get identity matrix. The values at the diagonal are all 1.
	 * 
	 * @param paraRows The given rows.
	 *********************
	 */
	public static IntMatrix getIdentityMatrix(int paraRows) {
		IntMatrix resultMatrix = new IntMatrix(paraRows, paraRows);
		for (int i = 0; i < paraRows; i++) {
			// According to access control, resultMatrix.data can be visited
			// directly.
			resultMatrix.data[i][i] = 1;
		} // Of for i
		return resultMatrix;
	} // Of getIdentityMatrix

此外,我们还创建了一个单位矩阵的方法。根据线性代数的知识可知,单位矩阵的行数=列数,且主对角线上全为1,因此我们定义一个IntMatrix类的对象resultMatrix;然后将resultMatrix的data属性初始化,使得其主对角线上全为1;最后再返回resultMatrix。

    /**
	 *********************
	 * Overrides the method claimed in Object, the superclass of any class.
	 *********************
	 */
	public String toString() {
		return Arrays.deepToString(data);
	} // Of toString

这里我们同样利用toString()方法进行遍历,在日撸Java三百行(day07:矩阵元素相加)中,我们就说过,Arrays.deepToString(数组名)用于输出多维数组的字符串形式。

二、getter与setter方法

getter方法和setter方法是面向对象编程中非常常用的方法,主要是用于访问和修改对象的属性(成员变量),具体如下:

  • Getter方法,也叫访问器,用于访问对象的属性值,它不接受任何参数,但要返回属性的值。Getter方法的命名常以“get”开头,后接属性的名称。
  • Setter方法,也叫修改器,用于修改对象的属性值,它接受参数,并用参数的值来更新属性的值。Setter方法的命名常以“set”开头,后接属性的名称。

总之,通过getter方法其他类可以获取属性的值而不用直接访问属性,通过setter方法其他类可以修改属性的值而不用直接修改属性,二者有效控制了对对象属性的访问和修改,相当于进行了封装,提高了安全性。

今天具体用到的getter方法与setter方法如下:

    /**
	 *********************
	 * Get my data. Warning, the reference to the data instead of a copy of the
	 * data is returned.
	 * 
	 * @return The data matrix.
	 *********************
	 */
	public int[][] getData() {
		return data;
	} // Of getData

	/**
	 *********************
	 * Getter.
	 * 
	 * @return The number of rows.
	 *********************
	 */
	public int getRows() {
		return data.length;
	} // Of getRows

	/**
	 *********************
	 * Getter.
	 * 
	 * @return The number of columns.
	 *********************
	 */
	public int getColumns() {
		return data[0].length;
	} // Of getColumns

	/**
	 *********************
	 * Set one the value of one element.
	 * 
	 * @param paraRow The row of the element.
	 * @param paraColumn The column of the element.
	 * @param paraValue The new value.
	 *********************
	 */
	public void setValue(int paraRow, int paraColumn, int paraValue) {
		data[paraRow][paraColumn] = paraValue;
	} // Of setValue

	/**
	 *********************
	 * Get the value of one element.
	 * 
	 * @param paraRow The row of the element.
	 * @param paraColumn The column of the element.
	 *********************
	 */
	public int getValue(int paraRow, int paraColumn) {
		return data[paraRow][paraColumn];
	} // Of getValue
  • getData(): 用于获取对象的data属性值
  • getRows():用于获取对象的行数属性值
  • getColumns():用于获取对象的列数属性值
  • setValue():用于修改对象data属性的某个元素值
  • getValue():用于获取对象data属性的某个元素值

三、矩阵相加与矩阵相乘方法

1.矩阵相加

    /**
	 *********************
	 * Add another matrix to me.
	 * 
	 * @param paraMatrix The other matrix.
	 *********************
	 */
	public void add(IntMatrix paraMatrix) throws Exception {
		// Step 1. Get the data of the given matrix.
		int[][] tempData = paraMatrix.getData();

		// Step 2. Size check.
		if (data.length != tempData.length) {
			throw new Exception("Cannot add matrices. Rows not match: " + data.length + " vs. "
					+ tempData.length + ".");
		} // Of if
		if (data[0].length != tempData[0].length) {
			throw new Exception("Cannot add matrices. Rows not match: " + data[0].length + " vs. "
					+ tempData[0].length + ".");
		} // Of if

		// Step 3. Add to me.
		for (int i = 0; i < data.length; i++) {
			for (int j = 0; j < data[0].length; j++) {
				data[i][j] += tempData[i][j];
			} // Of for j
		} // Of for i
	} // Of add

这里我们创建了一个外部输入矩阵与当前矩阵的加法运算,由于只有同型矩阵(即行数和列数均相等的矩阵)才能相加,所以在执行加法之前我们通过两个if语句来判断是否为同型矩阵;确定为同型矩阵后,再利用两层for循环实现相加。

接着,在此基础上我们又创建了一个方法,用于实现外部输入两个矩阵的相加,具体来说就是将其中一个外部输入矩阵作为当前矩阵,然后调用“外部输入矩阵与当前矩阵的加法运算”,代码如下:

    /**
	 *********************
	 * Add two existing matrices.
	 * 
	 * @param paraMatrix1 The first matrix.
	 * @param paraMatrix2 The second matrix.
	 * @return A new matrix.
	 *********************
	 */
	public static IntMatrix add(IntMatrix paraMatrix1, IntMatrix paraMatrix2) throws Exception {
		// Step 1. Clone the first matrix.
		IntMatrix resultMatrix = new IntMatrix(paraMatrix1);

		// Step 2. Add the second one.
		resultMatrix.add(paraMatrix2);

		return resultMatrix;
	} // Of add

 2.矩阵相乘

    /**
	 *********************
	 * Multiply two existing matrices.
	 * 
	 * @param paraMatrix1 The first matrix.
	 * @param paraMatrix2 The second matrix.
	 * @return A new matrix.
	 *********************
	 */
	public static IntMatrix multiply(IntMatrix paraMatrix1, IntMatrix paraMatrix2)
			throws Exception {
		// Step 1. Check size.
		int[][] tempData1 = paraMatrix1.getData();
		int[][] tempData2 = paraMatrix2.getData();
		if (tempData1[0].length != tempData2.length) {
			throw new Exception("Cannot multiply matrices: " + tempData1[0].length + " vs. "
					+ tempData2.length + ".");
		} // Of if

		// Step 2. Allocate space.
		int[][] resultData = new int[tempData1.length][tempData2[0].length];

		// Step 3. Multiply.
		for (int i = 0; i < tempData1.length; i++) {
			for (int j = 0; j < tempData2[0].length; j++) {
				for (int k = 0; k < tempData1[0].length; k++) {
					resultData[i][j] += tempData1[i][k] * tempData2[k][j];
				} // Of for k
			} // Of for j
		} // Of for i

		// Step 4. Construct the matrix object.
		IntMatrix resultMatrix = new IntMatrix(resultData);

		return resultMatrix;
	} // Of multiply

在日撸Java三百行(day08:矩阵相乘) 中,我们就已经详细地介绍过矩阵相乘的相关内容了,所以这里就不再重复赘述了。

四、数据测试

接着,我们创建如下的矩阵用于数据测试:

由于我们创建tempMatrix1对象时只规定了它的行数和列数,而int类型的默认初始值为0,所以矩阵tempMatrix1的元素刚开始全为0,然后我们通过setValue()方法对某些元素值进行了修改,最后就得到了如上图的矩阵。

    /**
	 *********************
	 * The entrance of the program.
	 * 
	 * @param args Not used now.
	 *********************
	 */
	public static void main(String args[]) {
		IntMatrix tempMatrix1 = new IntMatrix(3, 3);
		tempMatrix1.setValue(0, 1, 1);
		tempMatrix1.setValue(1, 0, 1);
		tempMatrix1.setValue(1, 2, 1);
		tempMatrix1.setValue(2, 1, 1);
		System.out.println("The original matrix is: " + tempMatrix1);

		IntMatrix tempMatrix2 = null;
		try {
			tempMatrix2 = IntMatrix.multiply(tempMatrix1, tempMatrix1);
		} catch (Exception ee) {
			System.out.println(ee);
		} // Of try
		System.out.println("The square matrix is: " + tempMatrix2);

		IntMatrix tempMatrix3 = new IntMatrix(tempMatrix2);
		try {
			tempMatrix3.add(tempMatrix1);
		} catch (Exception ee) {
			System.out.println(ee);
		} // Of try
		System.out.println("The connectivity matrix is: " + tempMatrix3);
	} // Of main

五、完整的程序代码

package matrix;

import java.util.Arrays;

/**
 * Int matrix. For efficiency we do not define ObjectMatrix. One can revise it
 * to obtain DoubleMatrix.
 *
 *@auther Xin Lin 3101540094@qq.com.
 */

public class IntMatrix {
	
	/**
	 * The data.
	 */
	int[][] data;

	/**
	 *********************
	 * The first constructor.
	 * 
	 * @param paraRows The number of rows.
	 * @param paraColumns The number of columns.
	 *********************
	 */
	public IntMatrix(int paraRows, int paraColumns) {
		data = new int[paraRows][paraColumns];
	} // Of the first constructor

	/**
	 *********************
	 * The second constructor. Construct a copy of the given matrix.
	 * 
	 * @param paraMatrix The given matrix.
	 *********************
	 */
	public IntMatrix(int[][] paraMatrix) {
		data = new int[paraMatrix.length][paraMatrix[0].length];

		// Copy elements.
		for (int i = 0; i < data.length; i++) {
			for (int j = 0; j < data[0].length; j++) {
				data[i][j] = paraMatrix[i][j];
			} // Of for j
		} // Of for i
	} // Of the second constructor

	/**
	 *********************
	 * The third constructor. Construct a copy of the given matrix.
	 * 
	 * @param paraMatrix The given matrix.
	 *********************
	 */
	public IntMatrix(IntMatrix paraMatrix) {
		this(paraMatrix.getData());
	} // Of the third constructor

	/**
	 *********************
	 * Get identity matrix. The values at the diagonal are all 1.
	 * 
	 * @param paraRows The given rows.
	 *********************
	 */
	public static IntMatrix getIdentityMatrix(int paraRows) {
		IntMatrix resultMatrix = new IntMatrix(paraRows, paraRows);
		for (int i = 0; i < paraRows; i++) {
			// According to access control, resultMatrix.data can be visited
			// directly.
			resultMatrix.data[i][i] = 1;
		} // Of for i
		return resultMatrix;
	} // Of getIdentityMatrix

	/**
	 *********************
	 * Overrides the method claimed in Object, the superclass of any class.
	 *********************
	 */
	public String toString() {
		return Arrays.deepToString(data);
	} // Of toString

	/**
	 *********************
	 * Get my data. Warning, the reference to the data instead of a copy of the
	 * data is returned.
	 * 
	 * @return The data matrix.
	 *********************
	 */
	public int[][] getData() {
		return data;
	} // Of getData

	/**
	 *********************
	 * Getter.
	 * 
	 * @return The number of rows.
	 *********************
	 */
	public int getRows() {
		return data.length;
	} // Of getRows

	/**
	 *********************
	 * Getter.
	 * 
	 * @return The number of columns.
	 *********************
	 */
	public int getColumns() {
		return data[0].length;
	} // Of getColumns

	/**
	 *********************
	 * Set one the value of one element.
	 * 
	 * @param paraRow The row of the element.
	 * @param paraColumn The column of the element.
	 * @param paraValue The new value.
	 *********************
	 */
	public void setValue(int paraRow, int paraColumn, int paraValue) {
		data[paraRow][paraColumn] = paraValue;
	} // Of setValue

	/**
	 *********************
	 * Get the value of one element.
	 * 
	 * @param paraRow The row of the element.
	 * @param paraColumn The column of the element.
	 *********************
	 */
	public int getValue(int paraRow, int paraColumn) {
		return data[paraRow][paraColumn];
	} // Of getValue

	/**
	 *********************
	 * Add another matrix to me.
	 * 
	 * @param paraMatrix The other matrix.
	 *********************
	 */
	public void add(IntMatrix paraMatrix) throws Exception {
		// Step 1. Get the data of the given matrix.
		int[][] tempData = paraMatrix.getData();

		// Step 2. Size check.
		if (data.length != tempData.length) {
			throw new Exception("Cannot add matrices. Rows not match: " + data.length + " vs. "
					+ tempData.length + ".");
		} // Of if
		if (data[0].length != tempData[0].length) {
			throw new Exception("Cannot add matrices. Rows not match: " + data[0].length + " vs. "
					+ tempData[0].length + ".");
		} // Of if

		// Step 3. Add to me.
		for (int i = 0; i < data.length; i++) {
			for (int j = 0; j < data[0].length; j++) {
				data[i][j] += tempData[i][j];
			} // Of for j
		} // Of for i
	} // Of add

	/**
	 *********************
	 * Add two existing matrices.
	 * 
	 * @param paraMatrix1 The first matrix.
	 * @param paraMatrix2 The second matrix.
	 * @return A new matrix.
	 *********************
	 */
	public static IntMatrix add(IntMatrix paraMatrix1, IntMatrix paraMatrix2) throws Exception {
		// Step 1. Clone the first matrix.
		IntMatrix resultMatrix = new IntMatrix(paraMatrix1);

		// Step 2. Add the second one.
		resultMatrix.add(paraMatrix2);

		return resultMatrix;
	} // Of add

	/**
	 *********************
	 * Multiply two existing matrices.
	 * 
	 * @param paraMatrix1 The first matrix.
	 * @param paraMatrix2 The second matrix.
	 * @return A new matrix.
	 *********************
	 */
	public static IntMatrix multiply(IntMatrix paraMatrix1, IntMatrix paraMatrix2)
			throws Exception {
		// Step 1. Check size.
		int[][] tempData1 = paraMatrix1.getData();
		int[][] tempData2 = paraMatrix2.getData();
		if (tempData1[0].length != tempData2.length) {
			throw new Exception("Cannot multiply matrices: " + tempData1[0].length + " vs. "
					+ tempData2.length + ".");
		} // Of if

		// Step 2. Allocate space.
		int[][] resultData = new int[tempData1.length][tempData2[0].length];

		// Step 3. Multiply.
		for (int i = 0; i < tempData1.length; i++) {
			for (int j = 0; j < tempData2[0].length; j++) {
				for (int k = 0; k < tempData1[0].length; k++) {
					resultData[i][j] += tempData1[i][k] * tempData2[k][j];
				} // Of for k
			} // Of for j
		} // Of for i

		// Step 4. Construct the matrix object.
		IntMatrix resultMatrix = new IntMatrix(resultData);

		return resultMatrix;
	} // Of multiply

	/**
	 *********************
	 * The entrance of the program.
	 * 
	 * @param args Not used now.
	 *********************
	 */
	public static void main(String args[]) {
		IntMatrix tempMatrix1 = new IntMatrix(3, 3);
		tempMatrix1.setValue(0, 1, 1);
		tempMatrix1.setValue(1, 0, 1);
		tempMatrix1.setValue(1, 2, 1);
		tempMatrix1.setValue(2, 1, 1);
		System.out.println("The original matrix is: " + tempMatrix1);

		IntMatrix tempMatrix2 = null;
		try {
			tempMatrix2 = IntMatrix.multiply(tempMatrix1, tempMatrix1);
		} catch (Exception ee) {
			System.out.println(ee);
		} // Of try
		System.out.println("The square matrix is: " + tempMatrix2);

		IntMatrix tempMatrix3 = new IntMatrix(tempMatrix2);
		try {
			tempMatrix3.add(tempMatrix1);
		} catch (Exception ee) {
			System.out.println(ee);
		} // Of try
		System.out.println("The connectivity matrix is: " + tempMatrix3);
	} // Of main

} // Of class IntMatrix

运行结果

总结

总的来说,今天的内容以及代码难度还是比较简单的,毕竟我们之前已经学过矩阵的一些运算了,所以今天的整数矩阵可以算是一个回顾;不过同时,今天也是一个铺垫,因为明天我们就会学习图的连通性,会涉及到邻接矩阵、连通矩阵,这就需要以今天的内容为基础进行延伸。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手持气象站:便携式、高精度设备

在科技日新月异的今天&#xff0c;气象观测技术正以前所未有的速度发展&#xff0c;从传统的地面观测站、高空探测到卫星遥感&#xff0c;每一步都极大地拓宽了我们对天气的认知边界。而在这股科技浪潮中&#xff0c;手持气象站作为一种便携式、高精度的气象监测设备&#xff0…

Ps:首选项 - 文件处理

Ps菜单&#xff1a;编辑/首选项 Edit/Preferences 快捷键&#xff1a;Ctrl K Photoshop 首选项中的“文件处理” File Handling选项卡允许用户精确控制 Photoshop 的文件保存行为和兼容性选项。这些设置非常重要&#xff0c;尤其在处理大文件或与其他软件协作时&#xff0c;可…

用Zipkin在分布式系统追踪收集和查看时间数据

Zipkin是一个开源的分布式追踪系统&#xff0c;它帮助收集、存储和展示实时的数据&#xff0c;以便于定位微服务架构中的延迟问题。以下是Zipkin的核心组件和工作流程的介绍&#xff0c;以及如何在Java中使用Spring Cloud Sleuth与Zipkin集成的案例。 Zipkin的核心组件&#x…

那些久远的开发语言(COBOL、Pascal、Perl等)还有市场吗

旧的开发语言 在旧的开发语言中&#xff0c;除了Combo和BASIC之外&#xff0c;还有一些其他曾经流行或具有重要历史意义的编程语言&#xff0c;例如&#xff1a; FORTRAN&#xff1a;1957年诞生&#xff0c;是第一个编译型语言&#xff0c;主要用于科学和工程计算 。LISP&…

RabbitMQ高级用法

&#x1f4a5; 该系列属于【SpringBoot基础】专栏&#xff0c;如您需查看其他SpringBoot相关文章&#xff0c;请您点击左边的连接 目录 一、发送者的可靠性 1. 生产者重试机制 2. 生产者确认机制【return和confirm机制】 &#xff08;1&#xff09;开启生产者确认 &#x…

ARCGIS XY坐标excel转要素面

1、准备好excel 坐标 excel文件转为csv才能识别&#xff0c;CSV只能保留第一个工作表并且&#xff0c;不会保留格式。 2、在ArcGis中导入XY事件图层 创建XY事件图层 图层要素赋对象ID 将导入的图层导出为先新的图层&#xff0c;这样就给每个要素附加了唯一的值 选择点集转线…

python模块03 --ddt数据驱动

自动化框架设计思想&#xff1a; (1) 数据驱动测试&#xff1a;即英文单词Data-Driven Testing&#xff0c;简称DDT。 (2) 关键字驱动测试&#xff1a;即英文单词Keyword-Driven Testing&#xff0c;简称KDT。 (3) 业务流程测试&#xff1a;即英文单词Business Process Tesi…

AI大模型:开源与闭源的激烈交锋与未来展望

在人工智能的浩瀚星空中&#xff0c;大模型作为技术的璀璨明珠&#xff0c;正引领着行业变革的浪潮。从最初的闭源垄断到如今的开源与闭源并驾齐驱&#xff0c;AI大模型的发布趋势、竞争格局以及技术演进&#xff0c;无不彰显着这一领域的蓬勃生机与无限可能。本文将深入探讨开…

大白话讲微服务的灾难性雪崩效应

讲在前面&#xff0c;为什么微服务需要有熔断等策略呢&#xff1f;今天我们用大白话来讲讲微服务的灾难性雪崩效应&#xff0c;熔断策略就是解决雪崩效应的有效解决方案。 什么是灾难性雪崩效应&#xff1f; 假设我们有两个访问量比较大的服务A和B&#xff0c;这两个服务分别依…

深度理解指针(2)

hello各位小伙伴们&#xff0c;关于指针的了解我们断更了好久了&#xff0c;接下来这几天我会带领大家继续我们指针的学习。 数组名的理解 我们首先来看一段代码&#xff1a; #include<stdio.h> int main () {int arr[10] {1,2,3,4,5,6,7,8,9,10};printf("arr …

汇编语言:标志寄存器ZF、PF、SF、CF、OF、DF、IF、AF

CPU内部的寄存器中&#xff0c;一种特殊的寄存器&#xff08;对于不同的CPU&#xff0c;个数和结构可能都不同&#xff09;&#xff0c;具有以下3种作用。 &#xff08;1&#xff09;用来存储相关指令的某些执行结果 &#xff08;2&#xff09;用来为CPU执行相关指令提供行为…

科技大通缩

BCG 增长份额矩阵的经典“摇钱树”象限。 来源&#xff1a;Understanding the BCG Growth Share Matrix and How to Use It &#xfeff; S 曲线的暴政 要了解这如何应用于科技行业&#xff0c;我们需要了解 S 曲线现象。 成功产品带来的价值通常会经历 S 曲线增长&#xff…

Python办公自动化 生成房产销售的分析报告【2】

学好办公自动化&#xff0c;走遍天下都不怕&#xff01;&#xff01; 办公三件套Excel、Word 和PPT。前面已经学习过如何处理excel数据以及批量自动生成word文档。 今天主要是利用前面学习的python-pptx模块并且根据房屋销售信息生成分析报告。报告总共6页内容&#xff0c;包括…

C++进阶之智能指针

一、为什么需要智能指针 下面我们先分析一下下面这段程序有没有什么内存方面的问题&#xff1f;提示一下&#xff1a;注意分析MergeSort 函数中的问题。 int div() {int a, b;cin >> a >> b;if (b 0)throw invalid_argument("除0错误");return a / b; }…

机器人学——逆向运动学(机械臂)

正/逆运动学对比 求解 求解目标 Reachable workspace 与 Dexterous workspace Subspace 解的数目 多重解 解的选择 求解方法 栗子一 x,y,fai已知&#xff0c;求解theta(1,2,3)的具体数值 几何法 余弦定理定义&#xff1a;对于任意三角形ABC&#xff0c;设其三个内角分别为…

Behind the Code:Ewald Hess 带你一起深度解读链上能源与外交

2024 年 9 月 14 日&#xff0c;《Behind the Code: Web3 Thinkers》第二季第九集上线。在本集中&#xff0c;Ewald Hess 深入剖析了区块链技术在推动能源市场变革中的关键作用。长期以来&#xff0c;传统能源行业因垄断和低效饱受批评&#xff0c;但随着 Bitcoin 和 Ethereum …

企业入驻西安国际数字媒体产业园的十大好处

在当今数字化飞速发展的时代&#xff0c;企业的发展需要依托创新的平台和资源的整合。西安国际数字影像产业园&#xff0c;作为数字产业的引领者&#xff0c;为入驻企业提供了众多独特的优势和机遇。 好处一&#xff1a;产业集聚效应。西安国际数字影像产业园汇聚了众多数字媒体…

字符函数内存函数———C语言

字符分类函数 头文件&#xff1a; ctype.h 函数功能iscntrl判断字符是否为控制字符isspace判断字符是否为空白字符&#xff08;空格&#xff0c;换页、换行、回车、制表符或垂直制表符&#xff09;isdigit判断字符是否为十进制数字isxdigit判断字符是否为十六进制数字(0-9)(a…

二分+划分型dp,CF 360B - Levko and Array

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 B - Levko and Array 二、解题报告 1、思路分析 最小化最大值&#xff0…

射频前端加LNA放大具体应用方案介绍

1.1编写目的 接收机为了适应在一些应用场合要求&#xff0c;需要增大接收强度&#xff0c;必要时在前段增加一个低噪声放大器LNA以增大链路增益&#xff0c;本文编写一个最简单的低成本的LNA&#xff0c;记录是想给大家一个引导思路或借鉴。 1.2背景 以micrf220这款芯片在…