更强大的矩阵内置库函数功能 1 :能够找到矩阵之间的共同和不共同元素
我不知道是否有内置函数能够在两个或多个矩阵元素数量不均时确定它们之间的共同元素和非共同元素。除了实际将数据放入数据表中之外,我知道在 JSL 中实现此目的的唯一方法如下。
A = Associative Array(Random Index(10,6));
Show(A);
B = Associative Array(Random Index(10,6));
Show(B);
Intersection = A ;
Intersection << Intersect(B);
Print(Intersection << Get Keys);
下面@gzmorgan0演示的方法仅适用于具有相同元素数量的矩阵
功能 2 :能够对矩阵进行排序,同时保留元素的位置( https://community.jmp.com/t5/Discussions/Sort-a-matrix/mp/85678#M38246 )
自动化和脚本回复:更强大的矩阵内置库函数@gzmorgan0我真的很喜欢这个 LFunc 函数。
回复:更强大的矩阵内置库函数@uday_guntupalli我认为你对 IsMember() 函数或 Intersect 的建议是一个很好的建议。 但是,您的示例仅涉及矩阵、数值。 对于任何类型对象的列表来说,这都是一个很好的函数。长期愿望清单项目包括:集合的并集和交集,以及将字符串和列表函数应用于列表中的每个项目的能力。 JSL Companion 第 2 版的相关脚本包括并集和交集函数的代码,例如 LFunc。 您可以制作常用自定义函数的脚本,并将它们包含在代码 Include( "mypath/myfuncs.jsl" ); 中。 。 然后只需在您的脚本中使用它们即可。 如果能内置其中一些功能就好了。下面是一个描述LF函数和喜欢以及在您的示例中使用这些函数的结果。定义这两个函数并带有大量注释和示例的脚本被命名为JSLC_CustomListFunctions.jsl关于您对原始位置的请求,对于列排序矩阵,对 Ian 排序进行简单修改并使用 Rank() 函数应该可以满足您今天的需求。
这里定义的函数有:
- LFunc( mylist, expr);其中表达式类似于 expr(Substr(x,1,1))。
- 喜欢(SourceStr,SearchStr);两个参数都是文本/字符串。 第二个参数使用 % 和 * 作为通配符。 请注意这是一个简化的正则表达式。
LFunc 可以节省编写 for 循环,Like 可以节省查找 REGEX 语法。
A = {5,3,4,2};
B = {2,4,4,4,6,8};
_xx = LFunc(A, expr(Loc(B,x))); //returns {[], [], [2, 3, 4], [1]}
_yy = LFunc(A, expr(Contains(B,x)>0 ) ); //returns {0, 0, 1, 1}
_zz = LFunc(B, expr(Contains(A,x))); //returns {4, 3, 3, 3, 0, 0}
LFUNC
//------LFunc-------------------------------------------------------------------
Lfunc = Function( {xList, fExpr/*ex. Expr(Contains(x,"h"))*/},
{x = {}, i = 1, errCode = 0, errStr = "\!NError bad argument", newExpr},
If( !Is List( xList ),
errCode = 1
);
If(
Type( Name Expr( fExpr ) ) == "Name",
//if Name then JMP does not recognize the function
tmp = Trim( Char( Name Expr( fExpr ) ) );
//extract the function and check if it is contained in the global namespace, if not error!
If( Namespace( "global" ) << Contains( Word( 1, tmp, ":(" ) ) == 0,
errCode = errCode + 2
);,
Type( Name Expr( fExpr ) ) != "Expression", errCode = errCode + 2
);
//catches typos, returns Name if not a valid function
//catches typos, returns Name if not a valid function
If( !Is Expr( Name Expr( fExpr ) ),
errCode = errCode + 2
); //catches syntax
If(
!errCode,
For( i = 1, i <= N Items( xList ), i++,
newExpr = Substitute( Name Expr( fExpr ), Expr( x ), xList[i] );
Insert Into( x, Try( newExpr, Empty() ) );
),
errCode == 1, Write( errStr || "(1) not a list \!N" ),
errCode == 2, Write( errStr || "(2) not a valid expression \!N" ),
errCode == 3, Write( errStr || "s (1) is not a list and (2) is not a valid expression \!N" )
);
x//return x
;
); //End Lfunc
//------------------------------------------------------------------------------
回复:更强大的矩阵内置库函数在 R 中,通过以下方式实现相同的效果:

在 Matlab 中,这是通过以下方式实现的:

回复:矩阵中常见元素和不常见元素的函数@gzmorgan0 ,
谢谢。 另外对我们之前的对话进行了更新,如果矩阵具有不同的行数或列数(具体取决于它是行向量还是列向量),我认为您推荐的方法不起作用,不是吗?
回复:矩阵中常见元素和不常见元素的函数JSL C同伴,JMP 脚本语言的应用,第二版。
回复:矩阵中常见元素和不常见元素的函数@gzmorgan0 ,
JSLC 代表什么?
回复:矩阵中常见元素和不常见元素的函数您的原始帖子指出“我不知道有一个内置函数能够确定两个或多个矩阵之间的常见和不常见元素。 ”
每个元素矩阵由一个值和一个位置组成。 因此,我使用了洛克()查找常见和不常见的函数元素。如果您要求常见和不常见,您的帖子会更准确价值观。
请注意,如果您感兴趣,可以使用索引来获取常见和不常见的值以及匹配矩阵和不匹配矩阵。
A= [2,3,4,7,8,9];
B= [2,4,5,6,7,9];
m_idx = loc(A==B);
u_idx = loc(A!=B);
m_mat = A[m_idx];
u_matA = A[u_idx];
u_matB = B[u_idx];
show(m_mat, u_matA, u_matB);
//or you can give a match or empty or unmatched and empty
x = J(5,4,RandomInteger(1,4));
y = J(5,4,RandomInteger(1,4));
e_mat = J(5,4,empty());
m_idx2 = loc(x==y);
u_idx2 = loc(x!=y);
matched_mat = e_mat;
matched_mat[m_idx2] = x[m_idx2];
unmatched_x = e_mat;
unmatched_y = e_mat;
unmatched_x[u_idx2] = x[u_idx2];
unmatched_y[u_idx2] = y[u_idx2];
show(x, y, matched_mat,unmatched_x,unmatched_y);
然而,矩阵是数字的。对于 JSLC v2,我们提供了几个 JMP 13 有限制的函数:我们最常使用的两个是 (1) LCombine()查找对象或矩阵列表的并集或交集。 列表可以包含字符串、表达式等。(2) LFunc()它允许 usr 定义应用于列表中每个元素的函数,例如 Contains(),因此用户不需要编写 for 循环脚本。
回复:矩阵中常见元素和不常见元素的函数@gzmorgan0 ,
感谢您的答复。 我尝试了你的建议,这是我的看法:
Clear Log(); Clear Globals();
A = Random Index(10,6);
Show(A);
B = Random Index(10,6);
Show(B);
show(loc(A==B));
show(loc(A!=B));
运行结果:

常见元素有 2、4、7 和 9 。 但是,上面仅返回各个位置中元素相同的位置
不常见元素位于位置 2、3、4 和 5,这也不是两个矩阵之间的不常见元素,而只是元素不相同的位置。
回复:矩阵中常见元素和不常见元素的函数您应该调查洛克()矩阵的函数。 如果您想查找非“常见”值,请使用 loc( A != B ) 或 loc( Abs(AB) >0 );
也抬头看看比较数据表
A = Random Index(10,6);
Show(A);
B = Random Index(10,6);
Show(B);
show(loc(A==B));
//Repeat 10 times
For (i=1, i<=10, i++,
X = J(5,3,RandomInteger(1,10));
Y = J(5,3,RandomInteger(1,10));
show(X, Y, Loc( X-Y ==0), Loc(X==Y));
);
//Note be careful if the values are "floating" numbers 5 might be stored as 5.000000001 or 4.999999999
//you might want to use Loc( Abs(X-Y) < 1e-32) some "fuzz factor"