루프 최적화안녕,
더 큰 데이터 세트를 실행하는 데 오랜 시간이 걸리는 일부 JSL 코드가 있습니다.
코드는 스트립의 평균 오프셋을 계산하기 위해 for 루프 내에서 for 루프를 실행합니다. 더 빠른 방법을 찾고 있습니다.
처리 속도를 높일 수 있는 방법이 있습니까? 현재 스크립트는 루프를 완료하는 데 ~20분이 걸립니다.
아래 스크립트는 다음과 같습니다.
Names Default To Here( 1 );
dt1 =Data table( "Reference data table.jmp" );
dt2 = Current data table(); /// Select Data table.jmp
Col_List1 = dt2 << Get Column Names( "String" );
For( c = 1, c <= N Col( dt2 ) -1, c++,
theMatrix = [];
name = Column( Col_List1[c] ) << Get name;
if (Contains( Col_List1[c], "Currents" )| Contains( Col_List1[c], "Voltage" )| Contains( Col_List1[c], "Resistance" ),
For( r = 1, r <= N Rows( dt2 ), r++,
mean = dt1:Mean[dt1 << Get Rows Where( :Tests == name )];
measure = mean - Col Mean( If( dt2:Strips == dt2:Strips[r], Column( dt2, c ), . ) );
theMatrix = theMatrix || Column( dt2, c )[r] + measure;
);
Column( dt2, c ) << Set Values( theMatrix );
););
스크립팅Re: 루프 최적화고마워 짐.
Re: 루프 최적화열 속성 "theMean"이 설정되지 않은 경우 처리를 우회하도록 코드를 수정했습니다.
Names Default To Here( 1 );
start = Today();
dt1 = Data Table( "Reference data table.jmp" );
dt2 = Current Data Table(); /// Select Data table.jmp
For( i = 1, i <= N Rows( dt1 ), i++,
theTest = dt1:Tests[i];
Try( Column( dt2, theTest ) << set property( "TheMean", dt1:mean[i] ) );
);
Col_List1 = dt2 << Get Column Names( "String" );
For( c = 1, c <= N Col( dt2 ) - 1, c++,
theMatrix = [];
name = Column( Col_List1[c] ) << Get name;
If( Contains( Col_List1[c], "Currents" ) | Contains( Col_List1[c], "Voltage" ) | Contains( Col_List1[c], "Resistance" ),
//For( r = 1, r <= N Rows( dt2 ), r++,
mean = .;
Try( mean = Column( dt2, col_list1[c] ) << get property( "theMean" ) );
// Don't process if a value for theMean does not exist
If( Is Missing( mean ) == 0,
For Each Row(
r = Row();
//mean = dt1:Mean[dt1 << Get Rows Where( :Tests == name )];
//measure = mean - Col Mean( If( dt2:Strips == dt2:Strips[r], Column( dt2, c ), . ) );
measure = mean - Col Mean( As Column( dt2, c ), :Strips );
theMatrix = theMatrix || Column( dt2, c )[r] + measure;
);
Column( dt2, c ) << Set Values( theMatrix );
);
);
);
Show( (start - Today()) / 60 );Re: 루프 최적화안녕 @txnelson ,
당신이 제안한 논리에 문제가 있습니다. 참조 데이터 테이블에 기본 데이터 테이블에 있는 테스트가 포함되어 있지 않으면 해당 테스트에서 행 값이 삭제됩니다. 참조 데이터 테이블에 있는 테스트만 오프셋합니다. 도움을 주시면 감사하겠습니다.

아래에 데이터 표를 첨부했습니다. 참조 테이블에 지정된 테스트만 오프셋하고 싶습니다.
Re: 루프 최적화짐에게 감사합니다. 그것은 매력처럼 작동합니다
Re: 루프 최적화@잭스미스12 , 조건이 무엇인지 잘 모르겠습니다. dt2:스트립 == dt2스트립[r] 해결해야 하지만 원하는 작업을 수행하지 않을 수 있습니다.
테스트할 테스트 데이터가 없으면 최적화를 시작하는 방법은 다음과 같습니다. 주요 데이터는 dt1을 사용하는 것입니다. << 행 가져오기 Where( :Tests == name ) 루프 외부.
Names Default to Here( 1 );
dt1 = Data Table( "Reference Data Table.jmp" );
dt2 = Current Data Table();
col list1 = dt2 << Get Column Names( "String" );
Summation( c = 1, N Col( dt2 ) - 1, //summation is faster that For() if you don't need to use Break() or Continue()
values = [];
name = Column( dt2, c ) << Get Name;
If( Contains( name, "Currents" ) | Contains( name, "Voltage" ) | Contains( name, "Resistance" ),
rows = dt1 << Get Rows Where( :tests == name ); // As Constant() prevents JMP from doing a lookup per row
col = Column( dt2, c );
col mean = Col Mean( col );
For Each Row( dt2,
mean = dt1:Mean[rows];
measure = mean - If( dt2:Strips == dt2:Strips /* always true */, col mean, 0 );
values |/= col[] + measure // append value to
);
col << Set Values( values )
);
0 // summation needs to end in a numeric
)
Re: 루프 최적화내가 문제를 보는 두 곳은
mean = dt1:Mean[dt1 << Get Rows Where( :Tests == name )];
그리고
measure = mean - Col Mean( If( dt2:Strips == dt2:Strips[r], Column( dt2, c ), . ) );
다음은 문제에 대한 해결 방법입니다. 문제를 확인하고 답변이 올바른지 확인하십시오.
Names Default To Here( 1 );
start=today();
dt1 =Data table( "Reference data table.jmp" );
dt2 = Current data table(); /// Select Data table.jmp
For(i=1,i<=nrows(dt1),i++,
theTest = dt1:Tests[i];
try(column(dt2,theTest) << set property("TheMean", dt1:mean[i]));
);
Col_List1 = dt2 << Get Column Names( "String" );
For( c = 1, c <= N Col( dt2 ) -1, c++,
theMatrix = [];
name = Column( Col_List1[c] ) << Get name;
if (Contains( Col_List1[c], "Currents" )| Contains( Col_List1[c], "Voltage" )| Contains( Col_List1[c], "Resistance" ),
//For( r = 1, r <= N Rows( dt2 ), r++,
For Each Row( r=row();
//mean = dt1:Mean[dt1 << Get Rows Where( :Tests == name )];
mean = column(dt2,col_list1[c]) << get property("theMean");
//measure = mean - Col Mean( If( dt2:Strips == dt2:Strips[r], Column( dt2, c ), . ) );
measure = mean - Col Mean(as Column( dt2, c ),:Strips);
theMatrix = theMatrix || Column( dt2, c )[r] + measure;
);
Column( dt2, c ) << Set Values( theMatrix );
););
show((start-today())/60);