更強大的矩陣內建庫函數功能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"