【科研心得】基於MATLAB的矩陣運算與OD矩陣處理的簡易教程

2021-02-19 數讀城事

好的!下面開始了,快上車吧( ̄) ̄)↗ 。矩陣,相信大家都不會陌生。矩陣的運算穿插了整個大學課程——《線性代數》。在這裡筆者想再龜毛幾句。記得大學那會兒《線代》也沒怎麼認真聽,寫作業就喜歡偷懶,會耍小聰明,自己就琢磨出來的歪門邪道一有空就拿Excel去算題。作業呢也基本上一口氣寫完不費勁 ( ‵▽′)ψ,考試前突擊了一下90分飄過了。(編輯註:老凡爾賽了)至於很複雜的矩陣運算,其實筆者(擅自地)認為只要不是真心想在考研上下功夫提分或者本身就是數學專業人士(在此希望不要被我無意冒犯),站在十幾年後本人的角度去想,當時在大學中花費太多的精力去深入學習高數其實並沒有那麼地需要,可能會觸及很多高深的我們無法觸及的高數世界而受到打擊導致對高數世界的探尋感到望而卻步(那種求知慾被碾壓的感覺你懂的)。相反如何活用高數的知識給將來的科研之路打基礎,如何讓高數的知識跟程式語言做結合,如何讓高數思想跟算法技巧結合,如何遇到問題能夠融會貫通以及如何學以致用才更重要。我們只需要記得曾經學過矩陣運算,將來記得線性代數的老師那句話就中:幾乎全部的矩陣運算都可以用Excel運算,所以能來堅持聽課,能好好寫作業就一定不會掛科的?!

圖1中演示了MATLAB文法如何定義矩陣。在變量A的後面用一個等號後接表示賦值;被中括號括住的都是矩陣內的元素;3×3矩陣裡,分號表示換行,空格或者逗號表示行方向的分割。

圖1

圖2中演示了元素的更替和指定。只需按照圖中所示範的command去執行就可以了。沒有什麼技術含量,在此就不贅述了。

圖2

圖3演示了子矩陣的抽出和指定。順便補充一句,冒號在矩陣之中元素(子矩陣)聲明和引用的時候十分常用。假如矩陣的尺寸很大例如1000×1000的時候,可以在格式上進行如此的活用:例如A(2:end,:)就表示第2行到最後1行的所有元素所構成的子矩陣;A(2:end-1,:)就表示第2行到倒數第2行的所有元素構成的矩陣(當然前提是A這個矩陣得足夠大,不然這裡的例子就會返回一個空矩陣)。有興趣的小夥伴不妨用很大的矩陣來定義A,再來體驗一下這個細節,在此不贅述。

圖3

圖4演示了矩陣的轉置,線代老師已教。需要注意的就是A右上角的單引號必須是英文半角輸入的。

圖4

接下來重點介紹一下基於MATLAB矩陣運算實現元素的過濾。在很多情況中,我們會遇到矩陣中元素過濾的場面。例如我們想過濾掉所有大於某個閾值的柵格(或者像元,網格)的時候就可以採用這種思路。圖5中解釋了如何進行元素的過濾。當然手法不一定唯一,需要注意的是星乘前面的那一個點還有英文半角的括號。邏輯判斷矩陣的幫助信息可以輸入help > 即可查閱MATLAB對運算符的詳細介紹,在此就不做贅述。

圖5

最後還需要介紹一下基於MATLAB矩陣運算實現矩陣的重構。我們在矩陣處理的時候經常會碰到矩陣的重構(比如:拼合)的情況。例如圖6紅色文字所示,zeros(3,1)構造一個3×1的全為0的矩陣,之後從右邊將之拼到A上面構成一個新的矩陣。輸入help zeros即可查閱此函數的詳細解釋。接下來如橙色字體所示,從下方將一個1×4的全為0的矩陣拼到A上面重構一個矩陣。需要特別注意矩陣的中括號內部聲明的時候什麼時候用空格(或者逗號),什麼時候用分號。

圖6

總結一下,其實基於MATLAB的矩陣運算還有許許多多技巧,筆者在此僅僅給了幾個本篇所要用到的例子。讀者朋友在碰到實際問題的時候,可以先動腦筋思考矩陣運算的步驟和原理,然後在嘗試利用線性代數的知識進行運算即可。正可謂,萬變不離其宗。記起來線代老師的話了麼,學好矩陣運算能夠讓複雜的運算變得簡便。這裡才是線代的真正魅力所在啊。

流空間(推薦一篇綜述論文)

首先OD矩陣是什麼?以下是百度百科收錄的解釋:OD矩陣以所有交通分區按行(起點區)與列(訖點區)排序,以任意兩分區之間的居民或車輛出行量(OD量)為元素的矩陣。按形式分,有矩形矩陣和三角形矩陣,前者能區分兩區間不同方向的出行量,後者只表示兩區間兩個方向出行量之和。按內容分,有分出行目的,分出行方式,或不分目的(「全目的」),不分方式(「全方式」)的各種矩陣。 [楊廣文.交通大辭典:上海交通大學出版社,2005.01]

OD矩陣是源點(Origin)-終點(Destination)矩陣的英文縮寫,所謂的點其實是一片交通劃分的區域,而該矩陣中的數據就是從區域A到區域B的交通流量,其實就是相當於你從一個地方到另外一個地方的路徑上的擁堵程度,一般用在交通領域。

從圖7不難理解OD矩陣的內涵,如何變換成ArcMap需要的XY列表形式的流數據,以及他們所對應的流空間模式。關於流空間,筆者在這裡想要重點安利一篇綜述文章,特別適合剛入門的同學或者論文開題時候的閱讀:王垚等 《「流空間」視角下區域空間結構研究進展》。這裡給出的例子是3個節點(比如城市,交通分區,生活圈等)之間的兩兩流動。對角線元素代表一個節點的內部流動(intra-regional flow),非對角線元素則代表一個節點的外部流動(inter-regional flow)。特別需要強調一點的是,本文對流空間的可視化還沒有考慮方向性,因為本文採用的例子是一個長期的國內旅客流動,存在一定的對稱性。倘若要考慮帶流動出入方向性的流空間的可視化,推薦使用Python實現,詳情請見本公眾號以前的帖子《利用Python繪製酷炫OD流量圖的新方法》。

圖7

接下來就到了OD矩陣處理與其GIS可視化的實踐階段了。本文採用的原始數據來源於日本國土交通省網站上所公布的1990年份的《全日本旅客純流動調查》,分別有兩種精度,50生活圈(跟都道府縣的區域基本重合)與207生活圈(考慮最小單位自治體功能配分的一種劃分)。本文採取的是前者的例子。跟生活圈的定義,數據的細節以及科研中活用可以參考論文:Liu K., & Dauda T. S. (2020). Structural Changes in Japan's Urban System from 1990 to 2010. Journal of Urban and Regional Analysis. 12(2), 117-143. 也可以關心下官方網站上公開的該調查的小冊子查閱空間編碼的情況,GIS基礎數據可以通過國土交通省網站上所公開的國土數值情報下載到。歷年的全日本旅客純流動調查的Excel數據(1990,1995,2000,2005以及2010年份),有興趣關心的同學可以嘗試去官方網站上自行下載,貌似無需申請只需要填寫問卷即可下載,為了防止版權糾紛,本文就不公開了, 。

0

還望諒解。

圖8的GIF演示了如何從Excel數據中複製粘貼需要的部分導入MATLAB。因為數據表格做的比較精緻,明確區分了航空流,鐵路流,汽車流以及全部交通方式的旅客流。本文所演示的部分存在不需要的表頭,欄位和文本部分,在這裡筆者就採用這種簡單粗暴的方式了。倘若表格數據量很大可以採用load函數,假如有大規模海量的表格需要批量處理的話就要考慮編寫實現自動化批量操作的程序了。

圖 8

下面的GIF動圖顯示了將原始數據,50生活圈的OD矩陣的數據複製粘貼到新的Excel工作表,儲存為乾淨數據1990.csv,並存入MATLAB的workspace目錄下。接下來,在MATLAB左側的找到csv文件,右擊,點擊最底下那一項input data,按照要求設定細節,選擇分隔符,next,next,重命名,很容易就可以加載進去(圖9)。

圖 9

在此需要特別指出的是,由於該《全日本旅客純流動》數據存在瑕疵,例如首都圈(千葉,埼玉,東京以及神奈川),中京圈(岐阜,愛知以及三重)以及近畿圈(京都,大阪,兵庫以及奈良)的內部旅客流由於種種原因並未被收錄(如圖10和圖11),原因可能是因為統計部門差異,數據量原因以及自治體的規模是特別不一樣的(人口密度太高面積又小,跨縣的通勤流動太頻繁,這極大影響旅客流動的調查的嚴謹性和單純性),故而本文一開始無視了這個問題,將三大都市圈是為均一的整體,也就是視為跟其他縣為同級別的生活圈,這裡如同該數據官方說明書的分區說明之中所聲明的那樣(如圖11)。後來在論文Liu & Tamba (2020)之中採用207生活圈為單位zone的數據進行了深入分析(如圖11),在此不做贅述。

圖 10圖11

清洗OD矩陣並將之轉化為XY列表形式的流數據的代碼如下圖12所示。請各位同學根據自己的數據情況靈活參考。筆者需要特別指出的是圖中利用for循環語句構造i和j角碼的列向量,建議這裡可以重點體會一下原理(較為抽象),這樣在面對自己數據的時候,具體問題具體分析然後謀求活學活用即可。

圖 12

從OD矩陣變換成流數據的處理已經通過圖13所展示。建議在調試成功之後的代碼直接存成m文件或者txt文件複製粘貼直接運行比較有效率而且容易糾錯和校正。在此聲明一下,GIF圖中原本的OD矩陣在此已經將其重命名為A變量。MATLAB中這裡定義OD為處理後的流數據。

圖 13

接下來需要實現GIS的可視化。需要特別指出的是筆者這裡僅僅是給出了XY列表流數據如何在GIS上實現可視化步驟,由於讀者朋友手頭的數據可能情況都不一樣,筆者還是希望能在本文把原理可以講解明白,如有疑問可在後臺留言區評論,還望諒解。加之本文沒有考慮流空間的方向性,倘若讀者朋友們有需要考慮方向性,建議採用Python工具進行可視化。

第一步是進行地理編碼,也就是給42個區域一個唯一識別,按1-42順序排列的ID(如圖14)。另外需要強調一點的是這裡的shp需要用世界的WGS坐標系因為後面需要用到經緯度。

圖14

第二步,在地理編碼完成(也就是給42個點shp賦予正確的ID)之後,將清洗好的OD數據(XY列表形式的流數據)加載到ArcMap的工作文件夾(圖15)。

圖15

第三步,在shp的屬性表裡新建兩列欄位XY,然後利用屬性表欄位運算給X計算經度,給Y計算緯度(如圖16)。

圖16

第四步,載入XY列表形式的流數據(如圖17)。

圖 17

第五步,點shp複製一份,一份拿來給出發地i列進行屬性表連結,一份拿來給目的地j那一列進行屬性表連結,如圖18所示。這樣我們就成功第把XY列表的起始點經緯度坐標放在了一張表裡面。

圖18

第六步,利用feature → XY to Line這個工具實現流數據的可視化。需要根據自己的數據情況進行合理地設定(如圖19)。

圖19

第七步,由於圖19中的操作僅僅是畫出來了OD的形狀,但沒有包含流動的值,需要在進行一步屬性表連結,然後才能進行數值分類(如圖20)。

圖20

最後就是調整地圖要素,專題地圖製作以及美工了。圖21給出了一些可視化的例子和筆者在ESRI Japan的展覽會上做的海報。

圖21

相關焦點

  • matlab矩陣及其運算(五)
    感謝大家對matlab愛好者公眾號的關注!如果公眾號文章對您有幫助,別忘了點擊分享和「在看」哦!
  • MATLAB的矩陣運算與重構
    數組運算與矩陣運算在MATLAB中,術語矩陣和數組在一般情況下是沒有區別的。嚴格地說,一個矩陣就是一個二維的數組,是用來進行線性代數運算的。MATLAB運用於矩陣上的數學運算符是以線性代數中的矩陣運算法則來進行計算的,而數組運算是基於兩個矩陣對應元素之間的,所以在MATLAB中,數組運算和矩陣運算是有區別的。
  • MATLAB矩陣及其運算(一)
    1、矩陣的創建matlab矩陣的創建方式有如下幾種:直接輸入、讀取外部數據、內置函數、M文件編程(a) 直接輸入:直接創建矩陣要注意如下規則:矩陣元素必須在方括號[ ]內;矩陣同行元素之間用空格或逗號(,)隔開;矩陣的行與列之間用分號(;)隔開。
  • MATLAB常用的矩陣運算指令
    今天主要分享MATLAB一些矩陣計算和簡單指令。MATLAB是一種交互式的以矩陣為基礎的計算平臺,主要用於求解各種複雜問題。所以其實矩陣的建立,矩陣的運算在MATLAB中是必不可少的。今天主要分享MATLAB一些矩陣計算和簡單指令。
  • matlab官方快速入門----矩陣和數組
    MATLAB®主要用於處理整個的矩陣和數組,而其他程式語言大多逐個處理數值,所有 MATLAB 變量都是多維數組,與數據類型無關。矩陣是指通常用來進行線性代數運算的二維數組。數組創建要創建每行包含四個元素的數組,請使用逗號 (,) 或空格分隔各元素。
  • MATLAB01:基本的數學運算與矩陣運算
    若微信排版有問題,請點擊閱讀原文查看MATLAB01:基本的數學運算與矩陣運算MATLAB基本語法變量變量名保留變量不適合做變量名變量不應當覆蓋內置函數變量類型數字型變量的顯示格式
  • MATLAB簡單粗暴教程(十二)——MATLAB常見錯誤提示
    這一篇文章暫時先簡單介紹一下matlab中常見的錯誤神馬的,算是一個小tips,希望能夠對大家平時的學習神馬的起到幫助。        有很多人問我寫這些教程是為了什麼,我說只是我想寫而已。人貴有自知之明,我知道我寫的不好,也知道沒多少人感興趣,沒多少人願意看,沒多少人感覺這個真的有用,但是我還是會寫下去,哪怕只有一個人感覺到有幫助,有作用,有提高,我也認為我的付出是值得的。
  • 基於複數浮點運算的協方差矩陣的FPGA實現
    採用FPGA(Field Programmable Gate Array)可以提高該類數位訊號處理運算的實時性,是算法工程化的重要環節。但是FPGA不適宜對浮點數的處理,對複雜的不規則計算開發起來也比較困難。故目前國內外協方差運算的FPGA實現都是採用定點運算方式。
  • 大牛心得:學習matlab的一點心得體會
    Matlab對研究生科研寫作過程中數據處理,畫圖制表,算法實現,模型模擬都挺有幫助,可以說是一件神器。
  • 【科研心得】基於MATLAB的曲線擬合
    先談下本文的寫作初衷,並不是為了營銷,就是想借用【數讀城事】這個平臺練習一下科研教學與寫作,並實實在在地傳授一些速成學習法和筆者自己體會的科研心得。MATLAB在數據量很龐大的時候,運算速度也遠勝於SPSS與Excel。感興趣的朋友可以進行其他的嘗試,在此筆者就不做贅述。本章節將簡單介紹一下MATLAB的入門知識與一些最基本的語法。MATLAB相信對科研人士來說可能並不陌生。它是一種面向數學運算,可視化以及編程的高水準對話型語言環境。它在產業界、政府部門、教育等領域都有廣泛應用,深受工程師和科研工作者的喜愛。
  • 教程| 基礎入門:深度學習矩陣運算的概念和代碼實現
    本文從向量的概念與運算擴展到矩陣運算的概念與代碼實現,對機器學習或者是深度學習的入門者提供最基礎,也是最實用的教程指導,為以後的機器學習模型開發打下基礎。在我們學習機器學習時,常常遇到需要使用矩陣提高計算效率的時候。如在使用批量梯度下降迭代求最優解時,正規方程會採用更簡潔的矩陣形式提供權重的解析解法。
  • 教程 | 基礎入門:深度學習矩陣運算的概念和代碼實現
    本文從向量的概念與運算擴展到矩陣運算的概念與代碼實現,對機器學習或者是深度學習的入門者提供最基礎,也是最實用的教程指導,為以後的機器學習模型開發打下基礎
  • 數學運算、矩陣和圖像
    那個時候沒有接觸微積分、沒有接觸矩陣論、沒有接觸圖像處理,也沒有接觸機器學習。我們不知道我們未來做什麼。但我們的目的是搭建一個體系,這個體系中基本上都是最基礎的知識,主要以數學為主。 從最開始的加、減、乘、除開始,有很多種數學運算,還有加權和、開方、指數、以e為底、log等運算。再到後面,有均值、方差、標準差、最值等。這些都是數學專業最最基礎的運算。
  • 對矩陣的簡單操作 | MatLab
    矩陣的運算方法1.矩陣的左乘和右乘3.我之前說過的——詭異的群運算這是由兩個矩陣,各個相應位置的元素相乘,所得到的矩陣a的特徵值,矩陣d為矩陣a特徵值所構成的對角陣,矩陣v的列向量為矩陣a的單位特徵向量,它與D中的特徵值一一對應7.Matlab提供的更多針對矩陣的運算//還沒完?!
  • 33頁深度學習矩陣運算基礎教程(附全文下載)
    我們知道,深度學習是基於線性代數和微積分的,反向傳播也離不開求導和矩陣運算。因此了解深度學習內部的數學原理也至關重要,本文從簡單函數求導,到多元函數求偏導,再到矩陣的微積分運算,逐層深入,引導我們探索深度學習背後的學習規則和數學基礎。
  • MATLAB矩陣與數組
    MATLAB既然以矩陣實驗室命名,就說明該軟體在矩陣計算方面具有非常優異的表現。在MATLAB中,一般情況下一個矩陣就是指一個長方形的數組。特殊情況有兩個,一是單一元素的標量,二是只有一行或者一列的矩陣,也就是向量。MATLAB也有其他儲存數值和非數值數據的方式,但是對於初學者來說,最好是將所有的情況都考慮為矩陣,這樣更容易使用。
  • MATLAB矩陣的尋訪與賦值
    3.邏輯1標識在實際使用中,有時會遇到尋找矩陣中大於或者小於某值的元素的問題,這時就可以使用邏輯1標識法。邏輯1標識用一個基於原矩陣A相對位置的邏輯數組B來對矩陣A進行尋訪。數據B中每一個true值也就是1表示相對位置的A中元素可以被尋訪。如果需要通過邏輯1標識來對矩陣進行尋訪,只需將符合條件的元素位置的標識設置為邏輯1即可。
  • 提高matlab代碼運行速度的一點心得(之三)
    另外,由於matlab在存儲管理上的不便,使得在同時提高時空兩域的效率變得更加困難,特別是在空間上(因為在時間上matlab提供了profiler這個非常有用的工具,但是在空間上就沒有)。當需要處理大量的數據時,精簡時空兩域的程序語句就尤為重要了。1.
  • 【乾貨】理解深度學習中的矩陣運算
    我們知道,深度學習是基於線性代數和微積分的,反向傳播也離不開求導和矩陣運算。因此了解深度學習內部的數學原理也至關重要,本文從簡單函數求導,到多元函數求偏導,再到矩陣的微積分運算,逐層深入,引導我們探索深度學習背後的學習規則和數學基礎。
  • MATLAB入門教程系列--基礎知識
    若要輸入矩陣,則必須在每一列結尾加上分號( ;),如下例:  A = [1 2 3 4; 5 6 7 8; 9 10 11 12];   A =   1  2  3 4   5  6  7 8   9 10 11 12  同樣地,我們可以對矩陣進行各種處理:  A(2,3) = 5 % 改變位於第二列