本文介绍了关于“Java线性代数的核心是什么”的知识。很多人在实际案例操作中都会遇到这样的困难。接下来,让边肖带领大家学习如何应对这些情况!希望大家认真阅读,学点东西!
00-1010我们想象一个超市只卖两种商品,卖蔬菜和大豆。每捆蔬菜5元,每箱大豆3元。此外,这家超市还有积分制,每捆青菜2分,每包黄豆4分。需要一个结算系统来为客户计算总价和积分。
这对程序员来说不是挑战。每种语言都可以轻松实现,比如Python:
#ByVameidefbill(x1,x2):
y1=5*x1 3*x2
y2=2*x1 4*x2
返回
Y1、y2x1和x2分别是蔬菜和大豆的数量。Y1和y2是总价和积分。通过输入不同品种的购买数量,我们得到产量。这里的输出有两个要素:总价和积分。
上述计算也可以写成一组简单的数学方程:
y1=5x1 3x2y1=5x1 3x2
y2=2x1 4x2y2=2x1 4x2
让我们想象一对夫妇去超市买菜的情况。老公买了一捆青菜和两箱黄豆,结账时11元10分。我妻子买了2捆青菜和3箱黄豆。结账的时候是19元16分。
但是如果妻子在退房前遇到丈夫,他们会把东西放在一起,总共3捆蔬菜和5箱大豆。根据我们的结算系统,总价是53 35=3053 35=30元,总积分是23 45=2623 45=26分。
你可以反驳我,何必呢?把这两个列表加在一起就行了。1 19=3011 19=30元,10 16=2610 16=26分。通过结算系统的计算结果完全相同。
这是正确的想法。您已经在使用线性系统的思想:
分别结账的几个购物车和几个小票中的项目之和与一次性总账计算的结果相同。
系统的线性更加复杂。给售货员两辆购物车,让售货员按同样的比例给丈夫弄三辆,给妻子弄两辆。那么,新的总价应该是丈夫的收据乘以3,加上妻子的收据乘以2。
线性思维方式是如此普遍,以至于我们必须思考更多才能得出非线性的例子。下面是一个非线性的情况:如果超市改变积分系统,如果积分超过20,就会得到二重积分。这时候如果我们分开结账,夫妻双方的分数都不到20,那么分数分别是10和16,合计就是26。当我们一起结账的时候,分数会是52,因为分数超过20。有生活经验的夫妻必须一起结账,而不是分开结账。
我们创造了一个非线性系统。将这个新的结算系统编译成函数,仍然使用Python:
#ByVameidefnon_linear_bill(x1,x2):
y1=5*x1 3*x2
y2=2*x1 4*x2ify220:
Y2=Y2*2returny1,y2非线性不是通常的思维方式。超市和商场往往有复杂的折扣、优惠券和积分系统,在许多情况下是非线性的。大脑需要大量的能量来处理它。所以,作为一个超线性的男生,我平时的想法是:去他妈的,我不用费那么大劲去结账或者分账。
(奇怪的是,Paper姐可以超熟练地处理各种非线性购物系统,甚至可以并行处理多个。上帝拿走的肋骨一定是非线性的.)
生活中的线性:超市结算
我们即将改变对单位数据的理解。说出一个数据。
作为程序员,最直接的方法就是列出一条数据,比如一个整数和一个浮点数。
那结构呢?C语言中的一个结构可以包含多个元素。我们知道,单独编写的每个元素都不是结构的完整数据。例如:
typedefstruct { intvegintbean
}购物车;说下去,一个物体的数据呢?一个对象可以有多个属性。当我们谈论一个对象的数据时,我们指的是该对象的多个属性。例如:
publicclassCart{
int veg; int bean;
}
再比如,我们在说一个人的数据时,包括姓名,身高、体重、IQ多个值。这多个值可以构成这个人的“一个”数据。我们可以在SQL数据库中建立这样一个Person(name, height, weight, IQ)的表。每一行,也就是一个记录(record),算是一个数据单位。
即使是列表这样的数据容器,如果固定每个位置数据的意义,那么一个列表也可以算是“一个”数据。比如丈夫购物车为[1,2],妻子的购物车为[2,3]。
这种包含了多个元素的数据,称为向量(vector)。与之对应,一个单一的数值,称为标量(scalar)。
一个向量
我们用带小箭头字母表示,来表示一个向量。比如丈夫的购物车:
x⃗ =[12]x→=[12]
向量可以相加减,这时只需要对应行的元素相加就可以,相当于合并或分开购物车。比如丈夫和妻子的购物车合并:
[12]+[23]=[35][12]+[23]=[35]
向量也可以与一个标量相乘。比如x⃗ ×5x→×5表示5个购物车的量。这时只需将标量与向量的各行元素相乘。
5[12]=[510]5[12]=[510]
伴随着向量,有一个简单的概念,即维度(dimension)。上面的购物车向量,包含了两个数值,即青菜的数目和黄豆的数目。我们因此说该向量是二维的。而结构体中元素的个数、对象的属性个数,都是维度。我会在以后的文章中深入维度这一概念。
有了对数据的深入理解,那么线性系统的特点可以总结如下:
L(aD1→+bD2→)=aL(D1→)+bL(D2→)L(aD1→+bD2→)=aL(D1→)+bL(D2→)
D1→D1→和D2→D2→是向量,分别是丈夫和妻子的购物车。而a, b为两个标量,比如a为2,b为3,表示丈夫那样的购物车乘2,妻子的购物车乘3。L为结算系统。方程右边表示,合在一起结账。方程右边表示,丈夫和妻子分开小票,相乘再相加。方程的两边相等。
矩阵革命
在数学上,我们已经有一组方程表示出了一个线性系统。上面的方程组有些不方便的地方:
-
输入的元素(黄豆数目)和系统参数(单价)混合在一起
-
有很多字母
数学家是偷懒的动物,这点和程序员很像。他们最后找到了一种省事的记述方式。利用刚才的向量。分离的表示输入、线性系统和输出的关系:
[1110]=[5234][12][1110]=[5324][12]
方程最左是个向量,最右是个向量。奇怪的是中间用括号括住的一堆数字。这被称为一个矩阵(Matrix)。可以看到,这个矩阵中有四个元素,包含了各个物品的单价和各个物品可获得的积分。这通常是结算系统所包含的数据。我们可以猜测到,这个矩阵相当于一个结算系统。左边的向量是输出,右边的向量是输入。
结算系统
这个结算系统运作时,把输入向量放横,再和结算系统的每一行元素分别相乘,即获得对应的输出元素。比如输出的第一个元素:
根据这一运算规则,一个线性系统就完全用一个矩阵表示出来了。
可以把矩阵表示成字母A,那么用代数的形式,写出输出和矩阵、输入的关系:
y⃗ =Ax⃗ y→=Ax→
这个代数形式,在线性代数中,有基础性的地位。方程的右边,我们说矩阵和向量进行了“乘法”运算。这一运算的规则,是按照我们上面所描述的那样运行的。这简直是对乘法符号的一次“运算符重载”(operator overload)。
我们可以用程序来实现上面的计算过程。编写类似的C程序并不复杂。更方便的是调用现有的库函数,比如Python中的numpy:
# By Vameiimport numpy as np# matrixa = np.matrix([[5, 3],[2, 4]])# input Vectorx = np.array([[1], [2]])# multiplicationy = np.dot(a, x)print(y)
矩阵这个东西把结算系统的表示方式大大缩减。更重要在于,线性系统和矩阵是互通的。矩阵表示的是一个线性系统。一个线性系统也总可以表示一个矩阵(证明从略)。
绕了半天,矩阵 = 线性系统。
“Java线型代数的核心是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/154655.html