優化循環你好,
我有一些 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 );
););
自動化和腳本編寫回覆:優化循環非常感謝吉姆。
回覆:優化循環如果未設定列屬性“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 );回覆:優化循環你好@tx尼爾森,
你說的邏輯有問題。 如果參考資料表不包含主資料表中的測試,它將從這些測試中刪除行值。 我只是為了抵消參考資料表中的測試。 任何幫助將非常感激

我附上了下面的數據表。 我只想抵消參考表中指定的測試
回覆:優化循環謝謝吉姆。 它的作用就像魅力
回覆:優化循環@傑基_ ,我不確定條件是什麼dt2:條 == dt2Strips[r]應該解決,但它可能沒有做你想要它做的事情。
如果沒有任何測試數據可供測試,我將如何開始優化它——主要是採用 dt1 << 取得行Where(:測試==名稱)在循環之外。
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
)
回覆:優化循環我看到問題的兩個地方是
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);