The Origin Forum
File Exchange
Try Origin for Free
The Origin Forum
Home | Profile | Register | Active Topics | Members | Search | FAQ | Send File to Tech support
Username:
Password:
Save Password
Forgot your Password? | Admin Options

 All Forums
 Origin Forum for Programming
 Forum for Origin C
 Speeding up long LatTalk column calculation in C
 New Topic  Reply to Topic
 Printer Friendly
Author Previous Topic Topic Next Topic Lock Topic Edit Topic Delete Topic New Topic Reply to Topic

ashvilki

USA
10 Posts

Posted - 08/26/2003 :  7:26:36 PM  Show Profile  Edit Topic  Reply with Quote  View user's IP address  Delete Topic
Hi, guys!
I have a LabTalk script calculating values in a column (MSQRT) from 12 other columns like this:

Col(XX)=col(G)*(-.172)+col(H)*(-.074)+col(I)*.122 +col(J)*.231+col(K)*.239+col(L)*.194+col(A)*.156+col(B)*(-.010);
Col(YY)=-(col(G)*(-.057)+col(H)*(-.019)+col(I)*(-.106)+col(J)*(-.022)+col(K)*.041+col(L)*.048+col(A)*(-.227)+col(B)*(.887));
Col(ZZ)=-(col(G)*(.229)+col(H)*(.310)+col(I)*.246+col(J)*.063+col(K)*(-.055)+col(L)*(-.108)+ col(A)*(-.022) + col(B)*(-.102));
Col(MSQRT) = sqrt(Col(XX)^2 + Col(YY)^2 + Col(ZZ)^2);

The worksheet is about 200,000 rows long and it takes forever to calculate. Is there a way to speed it up in Origin C?

Thanks a lot,

Alexei

couturier

France
291 Posts

Posted - 09/08/2003 :  05:25:52 AM  Show Profile  Edit Reply  Reply with Quote  View user's IP address  Delete Reply
Hi Ashvilki,
I can't help you with origin C but maybe you should try the following syntax in Labtalk:
col(XX)=col(G);
col(XX)*=-.172;
col(XX)+=col(H);
col(XX)*=-.074;
and so on...
it's a bit longer to type but should improve the speed.

I hope it'll help
Go to Top of Page

rlewis

Canada
253 Posts

Posted - 09/08/2003 :  1:53:14 PM  Show Profile  Edit Reply  Reply with Quote  View user's IP address  Delete Reply
Assuming no silly typos .. the following code should work annd be a lot faster than your LabTalk script ... But with 200K rows .. it may also take a while

bool column_calculations(string wksName)
{
/*
It is assumed that a worksheet named wksName exists and that it
contains columns A, B, G, H, I, J, K, L, ZZ, YY, ZZ, and Msqrt
*/
Worksheet wks;
if (wks.Attach(wksName))
{
Dataset dsA,dsB, dsG, dsH, dsI, dsJ, dsK, dsL, dsXX, dsYY, dsZZ, dsMsqrt;
if(dsA.Attach(wksName+"_A") && dsB.Attach(wksName+"_B") && dsG.Attach(wksName+"_G") &&
dsH.Attach(wksName+"_H") && dsI.Attach(wksName+"_I") && dsJ.Attach(wksName+"_J") &&
dsK.Attach(wksName+"_K") && dsL.Attach(wksName+"_L") && dsXX.Attach(wksName+"_XX") &&
dsYY.Attach(wksName+"_YY") && dsZZ.Attach(wksName+"_ZZ") && dsMsqrt.Attach(wksName+"_Msqrt"))
{
int nRows=dsA.GetSize();
if(nRows==dsB.GetSize() && nRows==dsG.GetSize() && nRows==dsH.GetSize() && nRows==dsI.GetSize() &&
nRows==dsJ.GetSize() && nRows==dsK.GetSize() && nRows==dsL.GetSize())
{
dsXX.SetSize(nRows);
dsYY.SetSize(nRows);
dsZZ.SetSize(nRows);
dsMsqrt.SetSize(nRows);
vector vA, vB, vG, vH, vI, vJ, vK, vL, vsX, vsY, vsZ;
vA.SetSize(nRows);
vB.SetSize(nRows);
vG.SetSize(nRows);
vH.SetSize(nRows);
vI.SetSize(nRows);
vJ.SetSize(nRows);
vK.SetSize(nRows);
vL.SetSize(nRows);
vsX.SetSize(nRows);
vsY.SetSize(nRows);
vsZ.SetSize(nRows);

// calculating Col(XX) values
vA=dsA*(0.156); vB=dsB*(-0.10); vG=dsG*(-0.172); vH=dsH*(-0.074);
vI=dsI*(0.122); vJ=dsJ*(0.231); vK=dsK*(0.239); vL=dsL*(0.194);
dsXX=vA; dsXX+=vB; dsXX+=vG; dsXX+=vH; dsXX+=vI; dsXX+=vJ; dsXX+=vK; dsXX+=vL;

// calculating col(YY) values
vA=dsA*(-0.227); vB=dsB*(0.887); vG=dsG*(-0.057); vH=dsH*(-0.019);
vI=dsI*(-0.106); vJ=dsJ*(-0.022); vK=dsK*(0.41); vL=dsL*(0.048);
dsYY=vA; dsXX+=vB; dsXX-=vG; dsXX+=vH; dsXX+=vI; dsXX+=vJ; dsXX+=vK; dsXX+=vL;

// calculating col(ZZ) values
vA=dsA*(-0.022); vB=dsB*(-0.102); vG=dsG*(0.229); vH=dsH*(0.310);
vI=dsI*(0.246); vJ=dsJ*(0.063); vK=dsK*(-0.055); vL=dsL*(-0.108);
dsYY=vA; dsXX+=vB; dsXX-=vG; dsXX+=vH; dsXX+=vI; dsXX+=vJ; dsXX+=vK; dsXX+=vL;

vsX=dsXX; vsX*=vsX;
vsY=dsYY; vsY*=vsY;
vsZ=dsZZ; vsZ*=vsZ;

dsMsqrt=vsX; dsMsqrt+=vsY; dsMsqrt+=vsZ;
dsMsqrt=sqrt(dsMsqrt);

return (true);
}
}
}
return (false);
}
Go to Top of Page

rlewis

Canada
253 Posts

Posted - 09/08/2003 :  2:17:48 PM  Show Profile  Edit Reply  Reply with Quote  View user's IP address  Delete Reply
Scratch my last post ... There are a few silly typos therein ... Hopefully, I've found them all ...

bool column_calculations(string wksName)
{
/*
It is assumed that a worksheet named wksName exists and that it
contains columns A, B, G, H, I, J, K, L, ZZ, YY, ZZ, and Msqrt
*/
Worksheet wks;
if (wks.Attach(wksName))
{
Dataset dsA,dsB, dsG, dsH, dsI, dsJ, dsK, dsL, dsXX, dsYY, dsZZ, dsMsqrt;
if(dsA.Attach(wksName+"_A") && dsB.Attach(wksName+"_B") && dsG.Attach(wksName+"_G") &&
dsH.Attach(wksName+"_H") && dsI.Attach(wksName+"_I") && dsJ.Attach(wksName+"_J") &&
dsK.Attach(wksName+"_K") && dsL.Attach(wksName+"_L") && dsXX.Attach(wksName+"_XX") &&
dsYY.Attach(wksName+"_YY") && dsZZ.Attach(wksName+"_ZZ") && dsMsqrt.Attach(wksName+"_Msqrt"))
{
int nRows=dsA.GetSize();
if(nRows==dsB.GetSize() && nRows==dsG.GetSize() && nRows==dsH.GetSize() && nRows==dsI.GetSize() &&
nRows==dsJ.GetSize() && nRows==dsK.GetSize() && nRows==dsL.GetSize())
{
dsXX.SetSize(nRows);
dsYY.SetSize(nRows);
dsZZ.SetSize(nRows);
dsMsqrt.SetSize(nRows);
vector vA, vB, vG, vH, vI, vJ, vK, vL, vsX, vsY, vsZ;
vA.SetSize(nRows);
vB.SetSize(nRows);
vG.SetSize(nRows);
vH.SetSize(nRows);
vI.SetSize(nRows);
vJ.SetSize(nRows);
vK.SetSize(nRows);
vL.SetSize(nRows);
vsX.SetSize(nRows);
vsY.SetSize(nRows);
vsZ.SetSize(nRows);

// calculating Col(XX) values
vA=dsA*(0.156); vB=dsB*(-0.10); vG=dsG*(-0.172); vH=dsH*(-0.074);
vI=dsI*(0.122); vJ=dsJ*(0.231); vK=dsK*(0.239); vL=dsL*(0.194);
dsXX=vA; dsXX+=vB; dsXX+=vG; dsXX+=vH; dsXX+=vI; dsXX+=vJ; dsXX+=vK; dsXX+=vL;

// calculating col(YY) values
vA=dsA*(-0.227); vB=dsB*(0.887); vG=dsG*(-0.057); vH=dsH*(-0.019);
vI=dsI*(-0.106); vJ=dsJ*(-0.022); vK=dsK*(0.41); vL=dsL*(0.048);
dsYY=vA; dsYY+=vB; dsYY-=vG; dsYY+=vH; dsYY+=vI; dsYY+=vJ; dsYY+=vK; dsYY+=vL;

// calculating col(ZZ) values
vA=dsA*(-0.022); vB=dsB*(-0.102); vG=dsG*(0.229); vH=dsH*(0.310);
vI=dsI*(0.246); vJ=dsJ*(0.063); vK=dsK*(-0.055); vL=dsL*(-0.108);
dsZZ=vA; dsZZ+=vB; dsZZ-=vG; dsZZ+=vH; dsZZ+=vI; dsZZ+=vJ; dsZZ+=vK; dsZZ+=vL;

vsX=dsXX; vsX*=vsX;
vsY=dsYY; vsY*=vsY;
vsZ=dsZZ; vsZ*=vsZ;

dsMsqrt=vsX; dsMsqrt+=vsY; dsMsqrt+=vsZ;
dsMsqrt=sqrt(dsMsqrt);

return (true);
}
}
}
return (false);
}
Go to Top of Page
  Previous Topic Topic Next Topic Lock Topic Edit Topic Delete Topic New Topic Reply to Topic
 New Topic  Reply to Topic
 Printer Friendly
Jump To:
The Origin Forum © 2020 Originlab Corporation Go To Top Of Page
Snitz Forums 2000