提高 JSL 效率:如何在每次运行后关闭绘图窗口,让 JSL 运行得更快而不压垮 PC。我目前有一张大表来运行多项式拟合。
1. 目标:生成多项式拟合参数并导出为表格。
2、问题:使用下面的JSL,跑全表耗时太长。所以我只能将表格分成小组来运行以避免 PC 崩溃。
3.原因:下表需要先拟合多项式曲线,然后生成汇总表,最后将所有类导出到1个表中。
假设有100k个类,拟合多项式曲线需要很长时间,然后导出到表。
4. 需要帮助:有人可以帮我修改 JSL 吗? 使其适合具有多项式曲线的每个类,然后导出到表格,然后关闭多项式曲线窗口。 这将保存DDR SDRAM继续运行所有 100k 类加起来只导出 100k 类的表,而不生成 100k 的绘图窗口。
谢谢您的帮助。
dt = Current Data Table();
biv = Bivariate( Y( :weight ), X( :age ), Fit Polynomial( 2, {Line Color( {47, 193, 29} )} ), By( :class ) );
rbiv = biv << report;
Summarize( groups = by( class ) ); // A list of all by-groups
n = N Items( groups );
//Create output table and fill with estimates
dtOut = New Table( "Polynominal parameters",
New Column( "class", Character ),
New Column( "T", numeric ),
New Column( "T2", numeric ),
addrows( n )
);
For( j = 1, j <= n, j++,
Estimates = rbiv[j]["Polynomial Fit Degree=2"]["Parameter Estimates"][1][3] << get as matrix;
:class[j] = groups[j];
:T[j] = Estimates[2];
:T2[j] = Estimates[3];
);
Re: 提高 JSL 效率:如何在每次运行后关闭绘图窗口,以使 JSL 运行得更快而不会压垮 PC。这是我对并行分配的尝试。我仍在学习它是如何工作的。
Names default to here(1);
dt = open("$SAMPLE_DATA\Big Class.jmp");
summarize(dt, ages = By(:age));
::results = J(nitems(ages), 3, -1);
driver = ::results[0, 1];
age_rows = {};
for(i=1, i<=nitems(ages), i++,
insert into(age_rows, dt << Get Rows Where(:age == Num(ages[i])));
);
y = dt:height << Get Values();
x = dt:weight << Get Values();
m = mean(x);
Parallel Assign({a = ages, ar = age_rows, y = y, x = x, m = m},
driver[i] = (
rows = ar[i];
ys = y[rows];
xs = x[rows];
xs2 = xs||(xs-m)^2;
print(i, ys, xs2);
batch interactive(1);
Try({b, vb} = Least Squares Solve(ys, xs2));
batch interactive(0);
::results[i, 0] = b`
);
);
show(::results);Re: 提高 JSL 效率:如何在每次运行后关闭绘图窗口,以使 JSL 运行得更快而不会压垮 PC。如果您不关心实际的情节,还有其他几种方法。我有时会看到减速只是为了渲染大量的情节。
1. 无平台计算。
Names default to here(1);
dt = open("$SAMPLE_DATA\Big Class.jmp");
summarize(dt, ages = By(:age));
dtOut = New Table( "Polynominal parameters",
New Column( "class", Character ),
New Column( "T", numeric ),
New Column( "T2", numeric ),
addrows(nitems(ages))
);
for(i=1, i<=nitems(ages), i++,
rows = dt << Get Rows Where(:age == Num(ages[i]));
y = dt:height[rows];
x = dt:weight[rows];
x2 = x||(x-ColMean(dt:weight))^2;
{b, vb} = Least Squares Solve(y, x2);
dtOut:class[i] = ages[i];
dtOut:T[i] = b[2];
dtOut:T2[i] = b[3];
);
2. 你可以用一组变量绘制一个图表,而不是用一个变量绘制一堆图表(我有时会得到这个帮助)。
biv = dt << Bivariate(
Y( :height ),
X( :weight ),
Group By(:age),
Fit Polynomial( 2 ),
invisible
);
report(biv)["Parameter Estimates"][TableBox(1)] << Make Combined Data Table
<<在平台上不可见几乎总是有帮助的。
Re: 提高 JSL 效率:如何在每次运行后关闭绘图窗口,以使 JSL 运行得更快而不会压垮 PC。非常感谢,这是一个比我原来的解决方案更好的解决方案。
我添加了一个 For 循环将大表子集为小表,并使用您的脚本来解决我的问题。
Re: 提高 JSL 效率:如何在每次运行后关闭绘图窗口,以使 JSL 运行得更快而不会压垮 PC。试试这个代码开始:
dt1 = Current Data Table();
// launch Bivariate with more than one By group, save list of analysis layer references
biv = dt1 << Bivariate( Y( :weight ), X( :age ), By( :sex ), Fit Polynomial( 2 ) );
// obtain first report layer reference and save
rbiv = biv[1] << Report;
// use first reference to send table box message
dt2 = rbiv["Parameter Estimates"][TableBox(1)] << Make Combined Data Table;
// process results as a data table
然后添加代码来修改数据表以满足您的需要。
Re: 提高 JSL 效率:如何在每次运行后关闭绘图窗口,以使 JSL 运行得更快而不会压垮 PC。谢谢回复。
可以根据上面的jsl帮忙修改吗?
不清楚该怎么做...
Re: 提高 JSL 效率:如何在每次运行后关闭绘图窗口,以使 JSL 运行得更快而不会压垮 PC。您不需要遍历每个类。 将 << Make Combined Data Table 发送到第一个 Parameter Estimates 大纲中的表格框。