本文主要介绍Armadillo的扩展函数。
扩展函数
setdiff
设置两个数组的差集
语法
arma::mat C = setdiff(A,B)
说明
C = setdiff(A,B)
返回 A 中存在但 B 中不存在的数据,不包含重复项。C 是有序的。
arma::mat setdiff(arma::mat A, arma::mat B){
arma::mat sortedA = arma::sort(arma::unique(A));
if (B.is_empty()){
return sortedA;
}
else{
double num, indexC, flag;
arma::mat intersectAB = arma::intersect(A, B);
arma::mat C(1, sortedA.n_elem, arma::fill:value(-1.0));
arma::mat CRes = {};
arma::uvec findABRes = {};
indexC = 0;
flag = 0;
for(int i = 0; i < sortedA.n_elem; i++){
num = sortedA(i);
findABRes = arma::find(intersectAB == num);
if (findABRes.is_empty()){
C(0, indexC) = num;
flag = 1;
indexC++;
}
}
if (flag){
CRes = C.cols(0, indexC - 1);
}
return CRes;
}
}
示例
- 两个向量的差集
/*
C = 1×3
1 3 5
*/
// 查找 A 中存在,但 B 中不存在的值。
arma::mat A = {3, 6, 2, 1, 5, 1, 1};
arma::mat B = {2, 4, 6};
arma::mat C = setdiff(A, B);
ismember
判断数组元素是否为集数组成员
语法
arma::field<arma::mat> C = ismember(A, B)
说明
[Lia,Locb] = ismember(A, B)
对于 A 中属于 B 的成员的每一个值,Lia返回一个在该位置包含逻辑值 1 (true) 的数组,Locb 会包含该值在B中的最小索引。值为 0 表示 A 不是 B 的成员。
arma::field<arma::mat> ismember(arma::mat A, arma::mat B){
arma::filed<arma::mat> result(2, 1);
arma::uvec findRes = {};
arma::mat Lia(1, A.n_elem, arma::fill::zeros), Locb(1, A.n_elem, arma
::fill::zeros);
arma::mat notFind = {};
for (int i = 0; i < A.n_elem; i++){
findRes = arma::find(B == A[i]);
if (!findRes.is_empty()){
Lia[i] = 1;
Locb[i] = arma::min(findRes) + 1;
}
else{
Lia[i] = 0;
Locb[i] = 0;
}
}
if (arma::accu(Lia) == 0 && arma::accu(Locb) == 0){
result(0, 0) = notFind;
result(1, 0) = notFind;
}
else{
result(0, 0) = Lia;
result(1, 0) = Locb;
}
return result;
}
示例
- 判断查询值是否为集成员并确定共有值的索引
/*
Lia = 1x4 logical array
0 0 1 1
Locb = 1×4
0 0 2 1
*/
// A(3) 的最小索引为 B(2),A(4) 可以在 B(1) 中找到。
arma::mat A = {5, 3, 4, 2,};
arma::mat B = {2, 4, 4, 4, 6, 8};
arma::field<arma::mat> C = ismember(A, B);
arma::mat Lia = C(0, 0);
arma::mat Locb = C(1, 0);
更新日志
- date: 2024-02-22
- desc: 添加目录
- desc: 添加更新日志,推荐阅读和文档