使用另一個矩陣(或列表)索引到一個矩陣(或列表)是一種使腳本又快又小的強大技術,但我們正在為 JMP 13 修復一個邊緣情況。 或許我應該將“修復”放在引號中,因為任何更改都可能造成破壞,這就是為什麼我想在 JMP 13 之前在此進行解釋。
下面是使用矩陣作為數據列索引的示例。
Open("$SAMPLE_DATA/Big Class.jmp");
tall rows = Loc(:height << Get Values() >= 67); // [25, 27, 30, 37, 39, 40]
:height[tall rows]; // [68, 69, 67, 68, 68, 70]
N Rows(:height[tall rows]); // 6
如果您不熟悉這種編程風格,第二行是關鍵。 “ :height << 獲取值() " 將高度列的值作為矩陣返回。 比較“ >= 67 " 返回一個由 0 和 1 組成的矩陣,對應於表達式為假 (0) 或真 (1) 的位置。 這位置()函數返回 1 在前一個矩陣中的位置。
在這種情況下,我們得到 [25, 27, 30, 37, 39, 40] 作為高度列大於或等於 67 的行號。 這本身就很方便,但真正的力量來自於能夠使用該矩陣作為列或其他矩陣的索引,如第三行和第四行。
這種技術的替代方法是編寫一個 For() 循環來明確地遍歷每一行。 當然,在這兩種情況下,JMP 仍在遍歷行,但如果在內部而不是在 JSL 中完成,速度要快得多。 沒有顯式循環,JSL 更緊湊。
我們可以用矩陣變量而不是數據列引用來做同樣的事情:
m = :height << Get Values();
tall rows = Loc(m >= 67); // [25, 27, 30, 37, 39, 40]
m[tall rows]; // [68, 69, 67, 68, 68, 70]
N Rows(m[tall rows]); // 6
到目前為止一切都很好。 讓我們看一下具有不同高度截斷值(70 而不是 67)的相同示例:
tall rows = Loc(:height << Get Values() >= 70); // [40]
:height[tall rows]; // [70]
N Rows(:height[tall rows]); // 1
m = :height << Get Values();
tall rows = Loc(m >= 70); // [40]
m[tall rows]; // 70
N Rows(m[tall rows]); // error
什麼地方出了錯? 請注意,data[tall rows] 返回了 70 而不是 [70]。 在許多情況下,1x1 矩陣和數字的處理方式相同,但並非總是如此。 N Rows() 函數是一個與眾不同的示例。 索引過於激進地將 1x1 矩陣“簡化”為數字。
一種解決方法是調用是矩陣()使用前N 行() . 另一種是將一個空矩陣連接到結果,這將創建一個矩陣,無論源是數字還是矩陣:
m = m |/ [];
在 JMP 13 中,維護 1x1 矩陣以便只要索引本身是矩陣,索引操作的結果就是矩陣. 這同樣適用於列表索引並且已經應用於數據列索引。
我們預計中斷很少見,因為觸發器並不常見,而且 1x1 矩陣和數字通常被視為相同。 儘管如此,JMP 13 調試器將能夠識別腳本中可能受更改影響的位置。
如果您有任何反饋或疑慮,請在此處告訴我們或聯繫丹尼爾瓦倫特查看您是否有資格參加 JMP 13 早期採用者計劃以在您自己的代碼上嘗試更改。
如何在調試器中為此關閉中斷警告?我必須一遍又一遍地點擊播放,它似乎不讓分析器工作。它只是卡住了,我不能再按播放了。
*編輯*沒關係。我找到了它的選項。謝謝
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我同意,最好有一個統一的索引。我確實喜歡這樣一個事實,即可以創建具有形狀的空矩陣。
很大的進步。 這是對矩陣的另一個建議:在使用條件時簡化索引。 這最好通過一個例子來解釋。 假設我有一個矩陣,我想查找並返回大於 5 的值:
mymatrix = [2,4,6,8,10];
newmatrix=mymatrix[loc(mymatrix>5)];
將此與 R 中的類似代碼進行比較:
mymatrix = matrix(cbind(2,4,6,8,10));
newmatrix=mymatrix[mymatrix>5];
好的,R 中的第一條語句更長,第二條語句返回一個向量而不是矩陣,但第二條語句更短。 如果 JMP 能夠在未來版本的第二條語句中實現更簡單的語法,那就太好了。
我同意對單值矩陣的新處理是一種改進,但我也支持 Mark Bailey 提出的消除令人困惑的空矩陣輸出 [](0,1) 的要求。 將其替換為 [] 將更易於用戶理解和處理。 我通常使用如下邏輯來處理這種情況:
dt=current data table();
rows_to_capture=dt<<GET rows="" where=""></GET>
它區分具有非零維度的不同空矩陣;有時形狀很重要:
show(x00,nrows(x00),ncols(x00));
show(x10,nrows(x10),ncols(x10));
show(x01,nrows(x01),ncols(x01));
show(x11,nrows(x11),ncols(x11));
x00 = [];
N Rows(x00) = 0;
N Cols(x00) = 0;
x10 = [](1, 0);
N Rows(x10) = 1;
N Cols(x10) = 0;
x01 = [](0, 1);
N Rows(x01) = 0;
N Cols(x01) = 1;
x11 = [1];
N Rows(x11) = 1;
N Cols(x11) = 1;
我們在高級腳本課程中有一個案例,結果是空矩陣,但實際返回的是[](0,1) ..這種形式似乎是無害的(也就是說,它表現得像一個簡單的空矩陣)但它總是需要解釋。 什麼是(0,1)代表以及如何使用它? 如果它不代表任何內容或服務於任何目的,那麼請考慮將其刪除。
我有很多代碼必須處理這個異常。這是一個明確的改進。感謝您的提醒,我將看看它將如何影響我用來處理這種情況的當前代碼模式。