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
 All Forums
 Origin Forum
 Origin Forum
 if(closest to value X)

Note: You must be registered in order to post a reply.
To register, click here. Registration is FREE!

Screensize:
UserName:
Password:
Anti-Spam Code:
Format Mode:
Format: BoldItalicizedUnderlineStrikethrough Align LeftCenteredAlign Right Horizontal Rule Insert HyperlinkUpload FileInsert Image Insert CodeInsert QuoteInsert List
   
Message:

* HTML is OFF
* Forum Code is ON
Smilies
Smile [:)] Big Smile [:D] Cool [8D] Blush [:I]
Tongue [:P] Evil [):] Wink [;)] Clown [:o)]
Black Eye [B)] Eight Ball [8] Frown [:(] Shy [8)]
Shocked [:0] Angry [:(!] Dead [xx(] Sleepy [|)]
Kisses [:X] Approve [^] Disapprove [V] Question [?]

 
Check here to subscribe to this topic.
   

T O P I C    R E V I E W
lillt91 Posted - 02/19/2018 : 06:55:20 AM
Origin Ver. and Service Release (Select Help-->About Origin):
Operating System:

Hi, I want to copy the value of column(2), which gets the closest to the value 1050 to a new column. An approach to solve my problem is my script below. But sometimes the script is not precise enough. I.e. when there are two values which satisfy my conditions. Then my script will always pick the 2nd value, because of the loop. Is there any chance to compare values to a set value (1050 in this example) and pick the one with the lowest deviation?

loop(row, 20, 90)
{
vgl1=wcol(2)[row]/1050;
if(vgl1>0.99 && vgl1<1.01)
{
wcol(3)[1]=wcol(1)[row];
wcol(4)[1]=wcol(2)[row];
}
}
5   L A T E S T    R E P L I E S    (Newest First)
lillt91 Posted - 02/21/2018 : 03:31:59 AM


So this is my worksheet. Col(1) is the main X-Axis with the time data I need. Col(2),Col(6), Col(10)... are my temperature columns.

I want the programm to find the closest value to 1050 for every column with temperature data from row 20 to 90 and from row 64 to 134 and give it out to column ii(+2). column ii(+1) should have the value of col(1) in the same row.

Edit:
I found a solution which works fine for me:
quote:
//X-Werte und so weiter
vglm1=200; vglm2=200; vglm3=200; vglm4=200;

loop(ii, 1, 56)
{
cc=ii*4-2;

limit wcol(cc); //Maximum jeder Spalte ausgeben lassen
bb=limit.imax;
wcol(cc+1)[3] = wcol(1)[bb];
wcol(cc+2)[3] = limit.ymax;

loop(row, 20, bb) //Linke Seite der Temperaturkurve
{
vgl1=abs(col($(cc))[row]-1050);
if(vgl1 < vglm1)
{
vglm1=vgl1;
min1=row;
}

vgl2=abs(col($(cc))[row]-1150);
if(vgl2 < vglm2)
{
vglm2=vgl2;
min2=row;
}
}
wcol(cc+1)[1]=col(1)[min1]; wcol(cc+2)[1]=wcol(cc)[min1];
wcol(cc+1)[2]=col(1)[min2]; wcol(cc+2)[2]=wcol(cc)[min2];

loop(row, bb, 134) //Rechte Seite der Temperaturkurve
{
vgl3=abs(col($(cc))[row]-1150);
if(vgl3 < vglm3)
{
vglm3=vgl3;
min3=row;
}

vgl4=abs(col($(cc))[row]-1050);
if(vgl4 < vglm4)
{
vglm4=vgl4;
min4=row;
}
}
wcol(cc+1)[4]=col(1)[min3]; wcol(cc+2)[4]=wcol(cc)[min3];
wcol(cc+1)[5]=col(1)[min4]; wcol(cc+2)[5]=wcol(cc)[min4];

}


arstern Posted - 02/20/2018 : 1:58:36 PM
Hi,

for(ii=1; ii<=255; ii++)
{
int ind = Index(1050, col($(ii)));

n=wks.ncols+1;

col($(n))[1]=col($(ii))[ind];
}


You can use this script if you want to find the value to the nearest 1050 for every column in the worksheet. It isn't exactly clear to me if you want to find for every column or for specific columns?

-Aviel
lillt91 Posted - 02/20/2018 : 07:38:58 AM
Thank you for your answers! Both work fine but I am struggling with putting those solutions into a loop like this:

loop(ii, 1, 225)
{
cc=ii*4;
loop(row, 20, 90)
{
vgl1=wcol(cc+2)[row]/1050;
if(vgl1>0.99 && vgl1<1.01)
{
wcol(cc+3)[1]=wcol(1)[row];
wcol(cc+4)[1]=wcol(cc+2)[row];
}

vgl2=wcol(cc+2)[row]/1150;
if(vgl2>0.99 && vgl2<1.01)
{
wcol(cc+3)[2]=wcol(1)[row];
wcol(cc+4)[2]=wcol(cc+2)[row];
}
}
}

edit: this is my not satisfying solution:
quote:
loop(ii, 1, 56)
{
cc=ii*4;

loop(row, 20, 90) //Linke Seite der Temperaturkurve
{
vgl1=wcol(cc+2)[row-1]-1050;
vgl2=sqrt(vgl1*vgl1);

vgl3=wcol(cc+2)[row]-1050;
vgl4=sqrt(vgl3*vgl3);

vglx=wcol(cc+2)[row]/1050;

if(vgl4 < vgl2 && vglx>0.99 && vglx<1.01){min1=row;}

vgl5=wcol(cc+2)[row-1]-1150;
vgl6=sqrt(vgl5*vgl5);

vgl7=wcol(cc+2)[row]-1150;
vgl8=sqrt(vgl7*vgl7);

vgly=wcol(cc+2)[row]/1150;

if(vgl8 < vgl6 && vgly>0.99 && vgly<1.01){min2=row;}
}

wcol(cc+3)[1]=col(1)[min1];
wcol(cc+4)[1]=wcol(cc+2)[min1];
wcol(cc+3)[2]=col(1)[min2];
wcol(cc+4)[2]=wcol(cc+2)[min2];
}
arstern Posted - 02/19/2018 : 10:57:42 AM
Hi,

You can also use Index function:

int ind = Index(1050, col(2));
wcol(3)[1]=wcol(1)[ind];
wcol(4)[1]=wcol(2)[ind];

https://www.originlab.com/doc/LabTalk/ref/Index-func

-Aviel
OriginLab
Hideo Fujii Posted - 02/19/2018 : 10:46:30 AM
Hi lillt91,

Could you please try the following snippet?
//////////////////////////////////////
iBegin=20;                              //Begining of row range
iEnd=90;                                //End of row range
range rr=col(B)[iBegin:iEnd];           //Range as a temp dataset
sum(abs(rr-1050));                      //Get stats
wcol(3)[1]=wcol(1)[sum.imin+iBegin-1];  //Original x of min
wcol(4)[1]=wcol(2)[sum.imin+iBegin-1];  //Original y of min
//////////////////////////////////////
Hope this works.

--Hideo Fujii
OriginLab

The Origin Forum © 2020 Originlab Corporation Go To Top Of Page
Snitz Forums 2000