使用另一个矩阵(或列表)索引到一个矩阵(或列表)是一种使脚本又快又小的强大技术,但我们正在为 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)代表以及如何使用它? 如果它不代表任何内容或服务于任何目的,那么请考虑将其删除。
我有很多代码必须处理这个异常。这是一个明确的改进。感谢您的提醒,我将看看它将如何影响我用来处理这种情况的当前代码模式。