使用矩陣

這個示範將說明使用矩陣的一些方法。因此,在課程日誌部分中,我將點擊“固化時間數據”。假設我們需要找到每個日期的平均治癒時間。因此,我們將每行的所有固化時間值相加,然後除以樣本數。我將使用矩陣來執行這個計算。再次強調,這些向量化操作將使其更加有效率。回到課程日誌,我有一個預先寫好的腳本,稱為「使用矩陣計算統計數據」。讓我移動它,以便我們可以看到固化時間表 - 我們甚至會讓它更寬一點 - 和我們的腳本。因此腳本首先建立一個名為 s 的變數。 s 將儲存 J 函數的結果。 J 函數建立一個具有指定行數、指定列數和某個起始值的矩陣。在這種情況下,我使用沒有參數的 Nrow 函數。因此它只會查看目前資料表中的行數。因此我將運行行,您可以在日誌中看到現在儲存在 s 中的是這個零列向量。我將使用它來添加每個固化時間值。所以我使用 for 迴圈。我初始化 c 等於,因為有了固化時間數據,我想從第二列開始。我測試 c 是否小於或等於列數。再次強調,最佳做法是,特別是當您可能要處理更大的資料表時,在 for 迴圈之外進行計數,將其儲存在變數中,然後將 c 與該變數進行比較。接下來,解析器評估 for 迴圈的主體。因此我們先來看看賦值函數的右邊。因此,我第一次將訊息作為矩陣發送到列,然後將其添加到 s 中。然後我們使用後增運算子更新 c。這樣就為 c 加了一個。我們進行測試以確保 c 仍然小於或等於列數。現在我們將列作為矩陣並將其添加到 s 中。因此,我將繼續運行各行並記住 for 函數將向日誌傳回一個缺失值。但是您可以將滑鼠懸停在 s 上以查看它現在包含這些相當大的數字,即所有五個固化時間列的總和。最後,我要向目前資料表發送一條訊息,即新列訊息。新列的標題將是「平均值」。對於值 — — 再次強調,這可以是設定值或值 — — 我實際上要進行計算。因此,我可以為值參數提供函數,而不必先建立變數來儲存這些函數。所以這裡的函數——我有一個除法函數和一個減法函數。我取 s,即固化時間列的總和,然後將其除以 c 減,因為我們從 開始計算 c,所以它是 c 減,這樣就從我們加起來的項目數中減去了一個。當然,c 必須透過測試來增加。它必定會失敗。因此,c 的最終值——我可以懸停並看到它是,然而,我們實際上只添加了一些東西。這就是為什麼我們要除以 c 減去所以我將繼續運行最後一行。您可以看到固化時間資料表中已建立「平均值」列。並且在日誌中指示,您可以看到我已經建立了一個列物件的實例。事實上,如果我想繼續使用該列,則可以將結果行上的所有內容分配給一個變數。現在,對於演示的下一步,我想一次處理所有的固化時間數據,執行計算。因此,我將把整個資料表提取為一個矩陣,而不是一次提取一列,就像我在這個預先編寫的腳本中所做的那樣。在此之前,我想刪除剛剛建立的那個列。所以我要選擇這個腳本編輯器視窗的全部內容。我將向當前數據表發送一條訊息。刪除列。我想要刪除的列是“平均值”。我想再次指出,當您測試或演示時,使用當前資料表非常方便。在生產類型的腳本中,我們確實希望對我們的表使用更明確的引用。因此,當您練習編寫腳本時,當前資料表很有用,只需測試一下就能知道某些東西是如何運作的。但在實踐中,如果您計劃部署或使用腳本並希望在 JMP 的不同版本以及多種使用情況下進行維護,我們會希望使用明確的資料表引用而不是當前資料表。所以我要繼續運行它。這就刪除了我想要刪除的列。將該可編寫腳本的訊息傳回日誌。現在讓我清除腳本編輯器視窗的內容。我將把整個資料表提取為一個矩陣並將其儲存在變數 m 中。所以m將會被賦值為向目前資料表發送訊息的結果。並且該訊息以矩陣形式獲取。所以我會運行它。您可以在日誌中看到,或者您可以將滑鼠懸停在 m 上,我現在得到了這個矩陣。第一列是這些非常巨大的數字。當然,這是因為當我將獲取的矩陣發送到資料表時,它會提取所有數字列。其中包括日期。因此這裡的日期被視為數字。您可以透過建模類型圖示來判斷,因為它是連續的。資料型別必須是數字。您實際上也可以 - 如果我將其加寬 - 即使日期中似乎有字符,那也只是格式化。所以它是右對齊的,因為它是一個數字。因此,也可以透過矩陣提取該值。如果我想計算固化時間——事實上,我想要做的計算將涉及找到最小值和最大值——我不希望矩陣中出現當天的這些大值。所以我要去新的一行。我會小心的。我想保留我已經擁有的內容 - 我已經將程式碼放入可見的視窗中,但我不想重新運行整個內容。所以我會非常小心地一次運行一行。為了擺脫第一列,我將使用變數 m 並用零和一作為下標。如果你還記得的話,下標只是意味著不要選擇任何特定的行。換句話說,給我第一列的所有行。我將為其分配一個空矩陣,它只是方括號,裡面沒有任何內容。再次,為了運行那一行,我可以突出顯示該行並使用我們用來運行整個腳本的任何方法。但它只會運行選定或突出顯示的部分。或者在標準桌上型電腦鍵盤的數位鍵盤上,我可以使用最右側的 Enter 鍵。因此返回到日誌的只是一個空矩陣。但是如果我現在將滑鼠懸停在 m 上或突出顯示 m 並運行它,您就會看到我們現在只有固化時間值。我們已經刪除了包含大日期數字的第一列。我將轉到新行並查看一些我們可以使用的其他矩陣函數。所以我要建立一個變數 a,它將被指派使用 loc 函數 LOC 的結果。我要在這個矩陣 m 中找到值大於的位置,當我運行該行時,我們將矩陣 m 視為行向量,並從第一個位置開始計數,然後返回矩陣中所有大於的元素的位置(單個下標位置)。現在,如果我想要實際值,我將建立一個名為 avals 的變數。我將對儲存在 m 中的矩陣以變數 a 進行下標的結果進行簽署。我就講這個。並且實際固化時間值超過了當然,為了簡化這個腳本,如果我不需要存儲所有這些值的位置,我實際上可以簡單地用 loc 函數對矩陣 m 進行下標 - 讓我複製這個 - 下標。我不需要這個額外的步驟來儲存位置然後使用它,除非我有其他原因要使用我在這個例子中最初儲存的位置。因此,我接下來要對這個矩陣進行的就是計算一些變換值。答案是,這種轉換將把整個表格中固化時間的每個觀察值減去最小值,除以最大到最小固化時間值的範圍,然後乘以,因此,這有點像是將每次觀察值與最小固化時間的距離作為範圍的比例。這說明了使用矩陣的另一個優點。為了在整個資料表中找到最小值,無論我是編寫腳本還是以互動方式工作,處理資料表中的各個列都需要很多步驟才能找到最小值或最大值。但是使用矩陣,我可以用一行很短的程式碼來完成它。因此,在我的腳本編輯器視窗中——讓我繼續並清除內容——我將創建一個變數 minCT——即最短固化時間,並且我將使用以 m 為參數的 min 函數的結果分配給該變數。我將繼續運行該線路。所以最小值是然後我也會建立一個變數 maxCT。我將使用以 m 為參數的 max 函數的結果賦給它。我就講這個。現在我可以使用這些變數來計算這個轉換。我將建立一個變數 t 來儲存變換值。讓我換一條線。因此,t 將被賦值為乘積的結果,然後用括號打開分子 m 減去 minCT,用括號關閉除法符號,然後用括號打開分母 maxCT 減去 minCT。因此我只需運行該行即可獲得這些轉換值。每個觀測值減去最小值作為固化時間值範圍的比例。現在,小數位有很多。我們確實沒有那麼高的精度。所以我們實際上可以對這些值進行四捨五入。我又將轉行了。我將透過將 round 函數的結果賦回給 t 來覆寫 t 中的值。如果您想保留原始變量,您可以在新變量中執行此操作。但我要輸入 t,然後輸入賦值運算符,也就是 round 函數。首先要討論的是,我要四捨五入什麼?所以我對 t 中儲存的值進行了四捨五入。那我想要多少位小數?我想要零。現在,這將截斷矩陣中的值。這與將資料列格式化為只有零個小數位(完整值仍儲存在背景)不同。所以這裡我不進行格式化。我實際上正在截斷這些值。我將繼續運行它。現在我已經獲得了轉換值的整數值。現在,如果您想將這些值放回固化時間資料表中,您可以循環遍歷矩陣並建立新列。如果我只想建立一個新的資料表,有一個非常簡單的函數叫做表。並且有用於命名該表和命名列的可選參數。為了使本演示簡單,我將僅使用變數 t 作為表格的參數。當我運行它時,我得到了這個帶有通用列名的無標題表。但是該變換矩陣的所有值都填入該表中。再次,我可以將名稱和列標題指定為表格參數的一部分。或者我可以使用腳本來事後修改它。因此,我們研究了幾種從資料表中提取數值的不同方法,可以按列或整個資料表、所有數字列、整個資料表,以及我們可以對矩陣進行的一些操作。