위치 반전 기능안녕하세요.특정 작업을 위해 이 JSL 함수를 만들었는데 더 좋은 방법이 있는지 궁금합니다.
내가 원하는 것은 인덱스 벡터가 있는 경우 벡터 요소의 값이 지정된 인덱스에 대해 1이고 그렇지 않으면 0인 지정된 링크의 표시기 벡터를 만드는 방법입니다.EG
[2, 3, 6] --> 길이가 10인 지시자 벡터로 변환합니다.
[0, 1, 1, 0, 0, 0, 1, 0, 0, 0]
사용 사례는 여러 조건을 기반으로 데이터 테이블에서 행의 하위 집합을 선택하는 것입니다. 여기서 각 조건에 대해 조건을 충족하는 행 번호의 벡터를 가져오고 모든 조건을 충족하는 행을 가져오려고 합니다.
// Loc Inverse Function
// This function converts a vector of positive integers (locvals) into an
// indicator vector of a specified length, n, with the values
// v[I] = 1 if I is in locvals, and 0 otherwise
// example
// Loc Inverse(6, [1,3])
// returns
// [1, 0, 1, 0, 0, 0]
*/
Loc Inverse = Function( {n, locvals},
v = J( n, 1, 0 );
v[locvals] = 1;
v;
);
예를 들어 사용 사례의 경우 세 가지 조건이 있는 경우 각 조건(v1, v2, v3)을 충족하는 벡터의 행 번호를 얻으므로 이렇게 합니다.
dt=current data table();
Loc Inverse = Function( {n, locvals},
v = J( n, 1, 0 );
v[locvals] = 1;
v;
);
// ...
// code to get v1, v2, v3
// ...
rowindicator1=Loc Inverse(n rows(dt), v1);
rowindicator2=Loc Inverse(n rows(dt), v2);
rowindicator3=Loc Inverse(n rows(dt), v3);
meet_all_conditions_indicator = rowindicator1 & rowindicator2 & rowindicator3;
rows_that_meet_all_conditions = Loc(meet_all_conditions_indicator);Re: Loc 역함수나는 당신의 접근 방식이 좋다고 생각합니다. 절 및/또는 행이 많거나 알 수 없는 수인 경우 행 번호의 행렬 목록을 허용하는 이 함수를 실험해 볼 수 있습니다.
common = function({nr, vList},
{default local},
mat = J(nr, 1, 0);
for each( {i}, 1::nitems(vList), mat[vlist[i]]++ );
return(loc(mat, nitems(vList)))
);
여기에서 가장 큰 이점은 하나의 전체 크기 배열만 만들고 저장해야 한다는 것입니다. 다음은 100만 행이 넘는 6개 절의 런타임을 비교하는 예입니다.
names default to here(1);
nr = 1e6;
p = 0.6;
nClause = 6;
//create a list of vectors, each representing the rows returned from a given clause.
//rows are selected with probability p within any clause
vecLis = {};
for each( {i}, 1::nClause, insertinto(vecLis, loc(J(nr,1, randombinomial(1,p)))));
Loc Inverse = Function( {n, locvals},
v = J( n, 1, 0 );
v[locvals] = 1;
v;
);
common = function({nr, vList},
{default local},
mat = J(nr, 1, 0);
for each( {i}, 1::nitems(vList), mat[vlist[i]]++ );
return(loc(mat, nitems(vList)))
);
t1 = hptime();
rws = common(nr,vecLis);
t2 = hptime();
t3 = hptime();
rowindicator1=Loc Inverse(nr, vecLis[1]);
rowindicator2=Loc Inverse(nr, vecLis[2]);
rowindicator3=Loc Inverse(nr, vecLis[3]);
rowindicator4=Loc Inverse(nr, vecLis[4]);
rowindicator5=Loc Inverse(nr, vecLis[5]);
rowindicator6=Loc Inverse(nr, vecLis[6]);
meet_all_conditions_indicator = rowindicator1 & rowindicator2 & rowindicator3 & rowindicator4 & rowindicator5 & rowindicator6;
rows_that_meet_all_conditions = Loc(meet_all_conditions_indicator);
t4 = hptime();
//Print(evalinsert("Number of Rows: ^nr^.\!NProportion 'Yes' ^p^.\!NNumber of clauses: ^nClause^."));
Print(evalinsert("single matrix approach: ^(t2-t1)/1e6^ secs."));
Print(evalinsert("InvLoc approach: ^(t4-t3)/1e6^ secs."));
Print(evalinsert("Answers differ or are empty: ^try(sum(rws != rows_that_meet_all_conditions), 1)"));

Re: Loc 역함수질문을 오해할 수도 있지만 Associative Array는 두 집합의 교차 집합을 얻을 수 있습니다.
Names Default To Here(1);
/* Sample Data */
n = 30000;
p = 9;
vec = J(n, p, .);
For(i = 1, i <= NCol(vec), i++,
vec[0, i] = (1::n)`*i;
);
/* From Here */
a={};
For(i = 1, i<=NCol(vec), i++,
a[i] = Associative Array(vec[0,i]);
);
For(i = 2, i <= N Items(a), i++,
a[1] << Intersect(a[i]); /* Intersection Set (A1 cap A2 cap ... cap Ap)*/
);
answer = a[1] <<GET keys=""></GET>Re: Loc 역함수안녕하세요 유스케 씨,
연관 배열을 토론에 가져 주셔서 감사합니다. 언급했듯이 <
예를 들어 아래에는 30K 행 x 9열 샘플 데이터 세트를 사용하여 각 방법을 비교하는 코드와 로그 출력이 포함되어 있습니다. 이 경우 연관 배열 방법은 행렬 방법보다 실행하는 데 약 65배 더 오래 걸립니다.
건배,
브래디
Names Default To Here( 1 );
/* Sample Data */
n = 30000;
p = 9;
vec = J( n, p, . );
For( i = 1, i <= N Col( vec ), i++,
vec[0, i] = (1 :: n)` * i
);
t1 = HP Time();
a = {};
For( i = 1, i <= N Col( vec ), i++,
a[i] = Associative Array( vec[0, i] )
);
For( i = 2, i <= N Items( a ), i++,
a[1] << Intersect( a[i] ); /* Intersection Set (A1 cap A2 cap ... cap Ap)*/
);
answer = a[1] << Get Keys;
t2 = HP Time();
common = Function( {nr, vList},
{default local},
mat = J( nr, 1, 0 );
For Each( {i}, 1 :: N Items( vList ), mat[vlist[i]]++ );
Return( Loc( mat, N Items( vList ) ) );
);
t3 = HP Time();
vecLis = {};
For Each( {i}, 1 :: N Col( vec ), Insert Into( vecLis, vec[0, i] ) );
nr = Max( vec );
answer2 = common( nr, vecLis );
t4 = HP Time();
Print( Eval Insert( "AAs: ^(t2-t1)/1e6^ secs; ^answer^." ) );
Print( Eval Insert( "matrix: ^(t4-t3)/1e6^ secs; ^answer2^." ) );

Re: Loc 역함수대단히 감사합니다, 브래디 씨
나는 또한 아래와 같이 For Each를 시도하지만 매트릭스 방법이 여전히 더 빠릅니다. 벡터에서 연관 배열을 만드는 데 많은 시간이 걸린다고 추측합니다.
t1 = HP Time();
a = Associative Array(vec[0, 1]);
For Each({i}, 2::N Col(vec),
a << Intersect(Associative Array( vec[0, i] ));
);
answer = a << Get Keys;
t2 = HP Time();