陣列(Array) 陣列物件功能介紹 陣列物件綜合範例 多重型態(Polymorphism)
何謂陣列? 陣列乃是相同資料型態的集結物件,如數值、布林值、字串。使用陣列,最大的好處在於資料的收集與處理。本章節將要介紹陣列物件之運用,包括陣列之大小、建立及索引,簡單介紹陣列的操作方式、使用技巧、以及一些陣列的運算
1. 陣列物件功能介紹 本節介紹陣列物件的用途以及功能,並配合簡單的例題輔助說明,幫助讀者了解如何使用這些物件。
陣列(Array)是相同形式數據資料的集合。在記憶體容許的情況下,陣列可為一維或多維,每維至多有231-1個元素。在LabVIEW中,陣列可為多種型式。在陣列中,透過索引可以找到元素所在的位置,索引值由0開始計算,其範圍是由0至n-1,其中n是陣列中元素的數目。下表顯示為一個一維陣列,注意元素第一個索引值為0,第二個為1,依此類推。
陣列控制與索引建立
自動索引建立陣列 For Loop與While Loop能在其迴圈範圍內自動建立陣列,稱為自動索引(auto-indexing)。圖7-5為一個自動索引的陣列。其中每執行一次迴圈便產生一個元素,待迴圈結束後,則將整個陣列一起傳送出迴圈。請注意傳遞資料的連線自迴圈邊界開始變粗,因為這條傳輸線的資料型態是一維陣列(即粗線表示陣列輸出輸入,數值為細線)。
建立二維陣列 一個二維陣列需要兩個索引值定義元素,其中一個為欄指標(直),一個為行指標(橫),二者的起始值均為0。圖7-9顯示為一個六欄四行的二維陣列,共包含6×4 = 24個元素。 要建立二維陣列一定要增加索引值,也就是在索引項拉出隨機式選單,選取加維(Add Dimension),圖7-10顯示欄與行的索引值。
自動索引決定For迴圈執行次數 當一個陣列進入一個For Loop,使用自動索引,LabVIEW會自動判斷是否以陣列的大小決定迴圈執行的次數。由陣列的大小與迴圈執行次數N去比較大小,迴圈執行次數以數目小的為準。以圖7-12為例,決定迴圈的執行次數,為陣列的大小,而非N值,因為陣列的大小較小。
在LabVIEW中,加法、乘法、除法等函數,都可應用於數值與陣列的運算,以加法為例,圖7-16表示純量加純量、純量加陣列、陣列加陣列等不同的結果,請特別注意比較傳輸線的粗細。
初始陣列(Initialize Array) 此函數是建立一新的陣列,且設定此陣列內容的起始值。 建立陣列(Build Array) 此函數可以結合:(a)兩個以上的元素成為一個一維陣列,(B)兩個以上的一維陣列組合成一維或二維陣列,取決於隨機選單中的組合輸入項目(Concatenate Inputs)是否被勾選。
陣列大小(Array Size) 此函數功能是決定輸入陣列的大小,如圖7-22所示。 陣列子集(Array Subset) 此函數可以設定索引及長度,在一陣列中取出一子陣列。
陣列索引(Index Array) 此函數是依照輸入之陣列及索引,取出該陣列索引值內的資料。圖7-27是利用此函數取出陣列的第二個元素,注意其索引值為2。
1.Array Size(陣列大小) :本物件可判斷一陣列中有多少行數與列數。本物件之介紹可以圖5-1-1為例,從路徑Functions>Array>Array Size,點選一陣列大小物件。 圖5-1-1 陣列大小物件
2.Index Array(陣列值索引) :本物件可藉由所輸入的行數與列數之值,在陣列中找出相對應位置上之值。 首先從路徑Functions>Array>Index Array,點選一陣列值索引物件,吾人可仿造前例並完成如圖5-1-2程式,程式執行後,就會將所輸入行數及列數的數值,由陣列輸出顯示物件處顯示所尋找到的值。 圖5-1-2 陣列值索引物件
3.Replace Array Subset(陣列值置換) :本物件可替換輸入陣列中任一數值。首先從路徑Functions>Array>Replace Array Subset,點選一陣列值置換物件,吾人可仿造前例並完成如圖5-1-3程式,程式執行後,就會將所指定的行數、列數之值以新的值加以替換,並在陣列輸出顯示物件處顯示替換後的陣列值。 圖5-1-3 陣列值置換物件
4.Insert Into Array(陣列值插入) :本物件可插入數值至輸入陣列中。首先從路徑Functions>Array>Insert Into Array,點選一陣列值插入物件,吾人可仿造前例並完成如圖5-1-4,只要設定所要插入的行數、列數之索引值與插入值,程式執行後就會在陣列輸出顯示物件處顯示插入後新的陣列值。 圖5-1-4 陣列值插入物件
5.Delete From Array(陣列值刪除) :本物件可刪除輸入陣列中的元素或次陣列。首先從路徑Functions>Array>Delete From Array,點選一陣列值刪除物件,吾人可仿造前例並完成如圖5-1-5,程式執行後,就會依指定的行、列索引值刪除該元素,而後陣列輸出顯示物件就會顯示刪除後的新陣列。 圖5-1-5 矩陣值刪除物件
6.Initialize Array(陣列初始化) :本物件可用以初始化一陣列。首先從路徑Functions>Array>Initialize Array,點選一陣列初始化物件,吾人可仿造前例並完成如圖5-1-6,只要設定所要建立的行數、列數之大小與初始陣列的值,程式執行後就會在輸出顯示物件顯示所建立的陣列。 圖5-1-6 初始值陣列物件
7.Build Array(陣列建立) :本物件可將輸入的各維數之陣列合併在一起,並產生一新的陣列。首先從路徑Functions>Array>Build Array,點選一陣列建立物件,吾人可仿造前例並完成如圖5-1-7,程式執行後,其輸入值就會在陣列輸出顯示物件處以陣列方式輸出 (本物件內定相同維度的陣列經建立後則以高一維度的陣列輸出表示,而不同維度的陣列經建立後則以輸入陣列的最高維度輸出,不同維度的陣列若欲予以建立,其維度只能相差一維,如有一2×2陣列,那它只能和3×3或1×1的陣列合併建立,元素的維度為0)。
圖5-1-7 陣列建立物件
8. Array Subset(取出子陣列) :本物件可從一陣列中,依指定的行列索引值及長度取出子陣列。首先從路徑Functions>Array>Array Subset,點選取出子陣列物件,並完成如圖5-1-8所示程式,程式執行後,程式將依所輸入的指定行列索引值及取出長度,自輸入陣列中取出子陣列 圖5-1-8 取出子陣列
9.Rotate 1D Array(旋轉一維陣列) :本物件可將輸入陣列之元素做旋轉移位。首先從路徑Functions>Array>Rotate 1D Array,點選旋轉一維陣列物件,吾人可仿造前例並完成如圖5-1-9,程式執行後,會依所設定的移動量n,將最後一個數值往前(後)移動,輸入的值有正負之分,正(往前)負(往後),最後在物件輸出處顯示旋轉後的新陣列值。 圖5-1-9 旋轉一維陣列值物件
10.Reverse 1D Array(反向一維陣列) :本物件可將輸入的一維陣列前後顛倒重新排列。首先從路徑Functions>Array>Reverse 1D Array,點選反向一維陣列物件,吾人可仿造前例並完成如圖5-1-10,程式執行後,會將所輸入的一維陣列值,顛倒排列,並在物件輸出處顯示顛倒排列後的結果。 圖5-1-10 反向一維陣列物件
11.Search 1D Array(搜尋一維陣列) :本物件可從輸入陣列中搜尋指定元素是否存在及該元素存在陣列中之索引值。首先從路徑Functions>Array>Search 1D Array,點選搜尋一維陣列物件,吾人可仿造前例並完成如圖5-1-11,程式執行後,就會將所要搜尋的元素,在物件輸出處顯示搜尋元素位於一維陣列中之索引值。 圖5-1-11 搜尋一維陣列物件
12.Split 1D Array(分割一維陣列) :本物件可將一維陣列分割成兩個一維子陣列。先從路徑Functions>Array>Split 1D Array,點選分割一維陣列值物件,吾人可仿造前例完成如圖5-1-12,程式執行後,程式將依所設定的Index值,將一維陣列分割成兩個一維子陣列。 圖5-1-12 分割一維陣列物件
13.Sort 1D Array(排序一維陣列) :本物件可將輸入的一維陣列之元素,依其值大小由小到大重新排列輸出。首先從路徑Functions>Array>Sort 1D Array,點選排序一維陣列物件,吾人可仿造前例並完成如圖5-1-13,程式執行後,程式將依所輸入的一維陣列中的元素,由小到大重新排列輸出。 圖5-1-13 排序一維陣列物件
14.Array Max & Min(陣列最大最小值) :本物件將陣列中所有的元素數值做比較,再將最大值與最小值及其對應索引值輸出。首先從路徑Functions>Array>Array Max & Min,點選陣列最大最小值物件,吾人可仿造前例並完成如圖5-1-14,程式執行後,程式將輸入陣列中所有的元素數值做比較,再輸出最大值與最小值,並且將最大值與最小值所在之索引值輸出。
圖5-1-14 陣列最大最小值物件
15.Transpose 2D Array(二維陣列轉置) :本物件可將輸入的二維陣列做轉置。首先從路徑Functions>Array>Transpose 2D Array,點選二維陣列轉置物件,吾人可仿造前例並完成如圖5-1-15,程式執行後,程式將輸入的二維陣列做轉置後輸出,即列的數值轉換成行的數值,行的數值轉換成列的數值。
圖5-1-15 二維陣列轉置物件
2. 陣列物件綜合範例 (以亂數建立陣列值) 1.首先在方塊圖工作區域點選並拖曳出一個For Loop物件,如圖5-2-1所示。 2. 陣列物件綜合範例 (以亂數建立陣列值) 1.首先在方塊圖工作區域點選並拖曳出一個For Loop物件,如圖5-2-1所示。 圖5-2-1 For Loop
2.重覆上述步驟,於For Loop內再產生另一個For Loop物件,如圖5-2-2所示。
3.因欲建立一3×3陣列,在外For Loop物件的N處按下滑鼠右鍵,並選擇Create Constant,產生輸入數3,最後,再將內外For Loop的N處在連線模式下連線,如圖5-2-3所示。 圖5-2-3 迴圈執行次數
4.產生行的數值,以0-1間之亂數產生,點選Functions>Numeric>Random Number (0-1),如圖5-2-4所示。
5.將亂數值連線至暫存器上,並於i處按滑鼠右鍵,點選Create Indicator,產生行的數值輸出物件欄,同上一步驟,在另一個迴圈產生列的數值輸出物件列如圖5-2-5所示。
6.為了使程式產生延遲,點選Functions>Time & Dialog>Wait Until Next ms Multiple,如圖5-2-6所示。
7.在延遲器左邊點滑鼠右鍵,選Create Constant並輸入250(延遲0.25秒),如圖5-2-7所示。 圖5-2-7 延遲器
8.再於迴圈的最外層接點處,點滑鼠右鍵選擇Creat Indicator,並命名為3x3 矩陣,再拉大前視面板上的Array元件成3x3的大小,則此程式便完成。
毫秒器函數 :以時間解析度毫秒來計時,從路徑unctions>Time & Dialog>Tick Count(ms) 點選。
(陣列對應元素相乘後總和) 1.首先在前視板工作區按右鍵點選Controls>Array & Cluster>Array建立一陣列,如圖5-2-15所示。 圖5-2-15 建立一陣列
2.再點選Controls>Numeric>Digital Control,並拖曳至陣列中,如圖5-2-16及圖5-2-17所示。 圖5-2-17 放入陣列中
3.重複上一步驟,建立另一個陣列,如圖5-2-18所示。 圖5-2-18 建立另一個陣列
4.至方塊圖工作區產生一個For Loop物件,如圖5-2-19及5-2-20所示。
5.在方塊圖工作區中點選Functions>Array>Array Size,並置於Array與For Loop之間,如圖5-2-21及圖5-2-22所示。
6.把線連接到For Loop的邊緣上,產生兩個自動索引器,並在兩個自動索引器上按右鍵,點選Disable Indexing,如圖5-2-23所示。
7.將滑鼠移到For Loop的邊緣並按右鍵,產生Add Shift Register,再產生一常數值0,如圖5-2-24所示。
8.在方塊圖工作區中點選Functions>Array>Index Array,如圖5-2-25所示。
9.將Index Array放置於For Loop中,並將線接好,如圖5-2-26所示。
10.將物件與線接好,將滑鼠移至右邊的Shift Register上按右鍵,產生Indicator,如圖5-2-27所示。 圖5-2-27 Create Indicator
11.程式完成後,在方塊圖工作區域物件的排列和連接大致如圖5-2-28所示。 圖5-2-28 方塊圖工作區域物件的排列
12.程式完成後,在前視板工作區域物件的排列大致如圖5-2-29所示。 圖5-2-29 前視板工作區域物件的排列
(字串與迴圈的組合) 利用迴圈做出下圖的陣列。 圖6-2-17
在前視版工作區域中抓出陣列,裡面放進字串的輸出元件,如圖6-2-18。 圖6-2-18 字串輸出陣列製作
2. 利用陣列常數Array Constant及數值常數Numeric 圖6-2-19 製作日期
3. 選取兩個次數迴圈控制,接上數值常數陣列後,索引功能自動判定兩個次數迴圈控制的次數,如圖6-2-20。 圖6-2-20 製作次數迴圈控制
4. 外面那個次數迴圈控制代表月份,內部的次數迴圈控制代表日期,如圖6-2-21。(迴圈是從零開始,所以要記得加上1。) 圖6-2-21 月數及日數的製作
5. 用固定字串做出『月』、『日』;再利用兩個Number To Decimal String物件把兩個數值變換成字串,如圖6-2-22。 圖6-2-22 統一字串格式
6. 把所有的字元組合起來,形成一個完整的日期。並利用次數迴圈控制的索引功能排列成一個二維陣列,如圖6-2-23。 圖6-2-23 組合字串 7.回到人機介面,按下執行,看看自己努力的成果吧!
(陣列元素順序排列) 將一維陣列元素數字由小到大排列。
1.建立一數值陣列,再建立Array Size物件及一迴圈物件,如圖5-2-30。 圖5-2-30 建立迴圈
2.尋找陣列中的最小值,並將其一一堆積起來,如圖5-2-31。 圖5-2-31 堆積陣列
3.每一次迴圈得到的最小數字,在下一次的迴圈中就不再出現,所以,一旦出現過的數字就必須在原本的陣列中予以刪除,如圖5-2-32。 圖5-2-32 完成圖
4.再於索引輸出暫存器上點滑鼠右鍵產生Indicator,圖5-2-33就是執行程式後的結果。 圖5-2-33 結果
(九九乘法表) 即國小時常背誦的九九乘法表。 1.九九乘法為一二維陣列,其程式含有兩個次數迴圈控制, 每一個次數迴圈控制的次數恰好都為9,如圖6-2-30。 圖6-2-30 設定次數迴圈控制及其次數
每一個次數迴圈控制中的數字起始皆為1,並且都需要將其轉換成字串,如圖6-2-29。 圖6-2-31 起始數字設定
3. 計算每一個乘法的結果,並同樣轉換成字串,如圖6-2-32。 圖6-2-32 計算結果
把所有從數字轉換而成的字串按順序結合,其間並插入〝×〞、〝=〞等符號,如圖6-2-33。 圖6-2-33 結合所有的獨立字串
經由次數迴圈控制的索引功能,把每一次的字串形成一個二維陣列,如圖6-2-34。 圖6-2-34 自動索引
6.返回前視版工作區域執行的結果,如圖6-2-35。 圖6-2-35 九九乘法表
(集結2的倍數或陣列)將1~100中所有2的倍數集結成一維陣列。 1.產生一個For Loop迴圈,因為1~100中2的倍數共有50個,故迴圈次數定為(100/2)次,如圖5-2-36。 圖5-2-36 設定迴圈
2.將2乘上每一次迴圈便會遞增的「i」值,再利用自動索引建構成陣列,如圖5-2-37。 圖5-2-37 自動索引集結2的倍數
3.程式執行後的結果,如圖5-2-38。 圖5-2-38 程式執行後的結果
3.多重型態(Polymorphism) 在LabVIEW環境下,很多物件可同時處理不同的資料格式輸入,如純量、陣列等等。例如,在LabVIEW環境下能把一個純量和一個陣列相加或者將兩個陣列加在一起,如下圖5-3-1所示多種型態相加。
圖5-3-1
純量與純量相加,所產生的結果是純量。純量與陣列相加,該純量將被加到陣列的每一個元素。陣列與陣列相加時陣列的每一個元素被加到另一陣列的相對應的元素中。陣列大小不一的相加結果僅對有匹配對應的元素做相加。表5-3-1整理了典型LabVIEW物件中能處理多重型態數據的物件。
表5-3-1 可處理多重型態物件一覽表