Java線型代數(shù)的核心是什么-創(chuàng)新互聯(lián)

本篇內(nèi)容介紹了“Java線型代數(shù)的核心是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)公司服務(wù)電話:18980820575,為您提供成都網(wǎng)站建設(shè)網(wǎng)頁設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),創(chuàng)新互聯(lián)公司網(wǎng)頁制作領(lǐng)域十載,包括護(hù)欄打樁機(jī)等多個(gè)行業(yè)擁有豐富的網(wǎng)站制作經(jīng)驗(yàn),選擇創(chuàng)新互聯(lián)公司,為網(wǎng)站保駕護(hù)航。

生活中的線性:超市結(jié)算

我們想象一個(gè)只賣兩個(gè)商品的超市,銷售青菜、黃豆。青菜每捆5元,黃豆每盒3元。此外,這個(gè)超市還有個(gè)積分系統(tǒng),每捆青菜積分2分,每包黃豆積4分。需要一個(gè)結(jié)算系統(tǒng),為客戶計(jì)算總價(jià)和積分。

這對程序員來說不算挑戰(zhàn)。每個(gè)語言都可以輕松的實(shí)現(xiàn),比如用Python:

# By Vameidef bill(x1, x2):
    y1 = 5*x1 + 3*x2
    y2 = 2*x1 + 4*x2
    return 
y1, y2

x1,x2分別為青菜和黃豆的數(shù)目。y1,y2為總價(jià)和積分。通過輸入不同品種的購買數(shù)目,我們得到輸出。這里的輸出有兩個(gè)元素:總價(jià)和積分。

上面的計(jì)算,還可以寫成一組簡單的數(shù)學(xué)方程:

y1=5×x1+3×x2y1=5×x1+3×x2

y2=2×x1+4×x2y2=2×x1+4×x2

我們試想這樣一種情況:一對夫妻去超市買菜。丈夫買了1捆青菜,2盒黃豆,結(jié)賬的時(shí)候,為11元和10個(gè)積分。妻子買了2捆綁青菜,3盒黃豆,結(jié)賬的時(shí)候,為19元和16積分。

但如果妻子結(jié)賬前碰到丈夫了,倆人把東西放在一起,總共3捆青菜,5盒黃豆。按照我們的結(jié)算系統(tǒng),總價(jià)為5×3+3×5=305×3+3×5=30元,總積分為2×3+4×5=262×3+4×5=26積分。

你可能會(huì)反駁我,為什么要那么麻煩呢?把剛才的兩個(gè)單子加在一起不就可以了。11+19=3011+19=30元,10+16=2610+16=26積分。這通過結(jié)算系統(tǒng)的計(jì)算結(jié)果完全相同。

這想法沒錯(cuò)。你已經(jīng)在運(yùn)用線性系統(tǒng)(Linear System)的思維了:

幾個(gè)購物車?yán)锏臇|西,分開結(jié)賬的幾張小票的總和,和一次算總帳的結(jié)果相同。

線性系統(tǒng)還有更復(fù)雜的情況。把兩個(gè)購物車給銷售員,讓銷售員按相同的配比,丈夫的來3車,妻子的來2車。那么,新的總價(jià),應(yīng)該是丈夫的小票乘3,加上妻子的小票乘2。

線性的思維方式是如此的普遍,以致于我們要多想一下,才能想出非線性的例子。下面是一個(gè)非線性的情況:超市更改積分系統(tǒng),積分超過20的話,將獲得雙倍積分。這個(gè)時(shí)候,如果分開結(jié)賬,丈夫和妻子的積分都不到20,那么積分分別為10和16,總和為26。而合在一起結(jié)賬,由于積分超過了20,積分將是52。有生活經(jīng)驗(yàn)的夫妻們,一定是合在一起結(jié)賬,而不是分開結(jié)賬了。

我們創(chuàng)造了一個(gè)非線性的系統(tǒng)。把這個(gè)新的結(jié)算系統(tǒng)編成函數(shù),依然用Python:

# By Vameidef non_linear_bill(x1, x2):
    y1 = 5*x1 + 3*x2
    y2 = 2*x1 + 4*x2    if y2 > 20:
        y2 = y2 * 2    return y1, y2

非線性并不是人們的慣常思維方式。超市和商場常有復(fù)雜的打折、贈(zèng)券、積分系統(tǒng), 這些系統(tǒng)很多時(shí)候是非線性的。大腦需要耗費(fèi)很大能量,才能處理得過來。于是,作為超級線性的男生,我通常的想法都是:去它媽的,老子不要那么麻煩的合單或拆單了。

(奇怪的是,妹紙可以超級熟練的處理各種非線性的購物系統(tǒng),甚至并行處理多個(gè)。上帝拿走的那根肋骨,一定是非線型的……)

“一個(gè)”

我們即將要改變我們對一個(gè)單位的數(shù)據(jù)的理解。舉出一個(gè)數(shù)據(jù)

做為程序員,最直接會(huì)列舉出一個(gè)數(shù)據(jù),比如一個(gè)整數(shù),一個(gè)浮點(diǎn)數(shù)。

那一個(gè)結(jié)構(gòu)體呢?C語言中的結(jié)構(gòu)體可以包含有多個(gè)元素。我們知道,每個(gè)元素分開寫出來,并不是結(jié)構(gòu)體的完整數(shù)據(jù)。比如:

typedef struct {    int veg;    int bean;
} Cart;

再繼續(xù),一個(gè)對象的數(shù)據(jù)呢?一個(gè)對象可以有多個(gè)屬性。當(dāng)我們說一個(gè)對象的數(shù)據(jù)時(shí),我們指的是這個(gè)對象的多個(gè)屬性。比如:

public class Cart{   int veg;   int bean;
}

再比如,我們在說一個(gè)人的數(shù)據(jù)時(shí),包括姓名,身高、體重、IQ多個(gè)值。這多個(gè)值可以構(gòu)成這個(gè)人的“一個(gè)”數(shù)據(jù)。我們可以在SQL數(shù)據(jù)庫中建立這樣一個(gè)Person(name, height, weight, IQ)的表。每一行,也就是一個(gè)記錄(record),算是一個(gè)數(shù)據(jù)單位。

即使是列表這樣的數(shù)據(jù)容器,如果固定每個(gè)位置數(shù)據(jù)的意義,那么一個(gè)列表也可以算是“一個(gè)”數(shù)據(jù)。比如丈夫購物車為[1,2],妻子的購物車為[2,3]。

這種包含了多個(gè)元素的數(shù)據(jù),稱為向量(vector)。與之對應(yīng),一個(gè)單一的數(shù)值,稱為標(biāo)量(scalar)。

 一個(gè)向量

我們用帶小箭頭字母表示,來表示一個(gè)向量。比如丈夫的購物車:

x? =[12]x→=[12]

向量可以相加減,這時(shí)只需要對應(yīng)行的元素相加就可以,相當(dāng)于合并或分開購物車。比如丈夫和妻子的購物車合并:

[12]+[23]=[35][12]+[23]=[35]

向量也可以與一個(gè)標(biāo)量相乘。比如x? ×5x→×5表示5個(gè)購物車的量。這時(shí)只需將標(biāo)量與向量的各行元素相乘。

5[12]=[510]5[12]=[510]

伴隨著向量,有一個(gè)簡單的概念,即維度(dimension)。上面的購物車向量,包含了兩個(gè)數(shù)值,即青菜的數(shù)目和黃豆的數(shù)目。我們因此說該向量是二維的。而結(jié)構(gòu)體中元素的個(gè)數(shù)、對象的屬性個(gè)數(shù),都是維度。我會(huì)在以后的文章中深入維度這一概念。

有了對數(shù)據(jù)的深入理解,那么線性系統(tǒng)的特點(diǎn)可以總結(jié)如下: 

L(aD1→+bD2→)=aL(D1→)+bL(D2→)L(aD1→+bD2→)=aL(D1→)+bL(D2→)

D1→D1→和D2→D2→是向量,分別是丈夫和妻子的購物車。而a, b為兩個(gè)標(biāo)量,比如a為2,b為3,表示丈夫那樣的購物車乘2,妻子的購物車乘3。L為結(jié)算系統(tǒng)。方程右邊表示,合在一起結(jié)賬。方程右邊表示,丈夫和妻子分開小票,相乘再相加。方程的兩邊相等。

矩陣革命

在數(shù)學(xué)上,我們已經(jīng)有一組方程表示出了一個(gè)線性系統(tǒng)。上面的方程組有些不方便的地方:

  • 輸入的元素(黃豆數(shù)目)和系統(tǒng)參數(shù)(單價(jià))混合在一起

  • 有很多字母

數(shù)學(xué)家是偷懶的動(dòng)物,這點(diǎn)和程序員很像。他們最后找到了一種省事的記述方式。利用剛才的向量。分離的表示輸入、線性系統(tǒng)和輸出的關(guān)系:

[1110]=[5234][12][1110]=[5324][12]

方程最左是個(gè)向量,最右是個(gè)向量。奇怪的是中間用括號括住的一堆數(shù)字。這被稱為一個(gè)矩陣(Matrix)??梢钥吹剑@個(gè)矩陣中有四個(gè)元素,包含了各個(gè)物品的單價(jià)和各個(gè)物品可獲得的積分。這通常是結(jié)算系統(tǒng)所包含的數(shù)據(jù)。我們可以猜測到,這個(gè)矩陣相當(dāng)于一個(gè)結(jié)算系統(tǒng)。左邊的向量是輸出,右邊的向量是輸入。

結(jié)算系統(tǒng)

這個(gè)結(jié)算系統(tǒng)運(yùn)作時(shí),把輸入向量放橫,再和結(jié)算系統(tǒng)的每一行元素分別相乘,即獲得對應(yīng)的輸出元素。比如輸出的第一個(gè)元素:

Java線型代數(shù)的核心是什么

根據(jù)這一運(yùn)算規(guī)則,一個(gè)線性系統(tǒng)就完全用一個(gè)矩陣表示出來了。

可以把矩陣表示成字母A,那么用代數(shù)的形式,寫出輸出和矩陣、輸入的關(guān)系:

y? =Ax? y→=Ax→

這個(gè)代數(shù)形式,在線性代數(shù)中,有基礎(chǔ)性的地位。方程的右邊,我們說矩陣和向量進(jìn)行了“乘法”運(yùn)算。這一運(yùn)算的規(guī)則,是按照我們上面所描述的那樣運(yùn)行的。這簡直是對乘法符號的一次“運(yùn)算符重載”(operator overload)。

我們可以用程序來實(shí)現(xiàn)上面的計(jì)算過程。編寫類似的C程序并不復(fù)雜。更方便的是調(diào)用現(xiàn)有的庫函數(shù),比如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)

矩陣這個(gè)東西把結(jié)算系統(tǒng)的表示方式大大縮減。更重要在于,線性系統(tǒng)和矩陣是互通的。矩陣表示的是一個(gè)線性系統(tǒng)。一個(gè)線性系統(tǒng)也總可以表示一個(gè)矩陣(證明從略)。

繞了半天,矩陣 = 線性系統(tǒng)。

“Java線型代數(shù)的核心是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

網(wǎng)站名稱:Java線型代數(shù)的核心是什么-創(chuàng)新互聯(lián)
本文網(wǎng)址:http://www.muchs.cn/article0/epsoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、服務(wù)器托管、網(wǎng)站建設(shè)、做網(wǎng)站微信公眾號、小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)