T O P I C R E V I E W |
michaeli98 |
Posted - 07/19/2012 : 4:51:10 PM Origin Ver. and Service Release (Select Help-->About Origin): OriginPro 8.6.0 SR3 b99 Operating System: XP SP3
Hi,
I am trying to sequentially fit two columns to a straight line (first 5 rows, 6, 7, 8, 9, and so on until the end of the column). I am trying to use a for-loop to do this, but seems like the index does not change. any suggestions are greatly appreciated. Here is the code that I have so far.
void linearfit() {
// Get XY data from worksheet window Worksheet wks = Project.ActiveLayer(); if(!wks) return; // need to activate a worksheet with data WorksheetPage wp = wks.GetPage();
DataRange dr;
int nRows = wks.GetNumRows();
printf("Number of rows is %d\n", nRows);
for(int ii=5; ii<nRows; ii++) { dr.Add("X", wks, 1, 0, ii, 0); // x column dr.Add("Y", wks, 1, 1, ii, 1); // y column vector vX; dr.GetData(&vX, 0); // get data of x column to vector vector vY; dr.GetData(&vY, 1); // get data of y column to vector
// Do linear fit with the above input dataset and fit option settings int nSize = vX.GetSize(); // data size printf("Data size is %d\n", nSize);
FitParameter psFitParameter[2]; // two parameters RegStats stRegStats; // regression statistics RegANOVA stRegANOVA; // anova statistics int nRet = ocmath_linear_fit(vX, vY, nSize, psFitParameter, NULL, 0, NULL, &stRegStats, &stRegANOVA); if(nRet != STATS_NO_ERROR) { out_str("Error"); return; } // Output analysis result to Script window, Result Log and Worksheet // print the values of fitting parameters to the Script Window vector<string> vsParams = {"Intercept", "Slope"}; for(int iPara = 0; iPara < vsParams.GetSize(); iPara++) { printf("%s = %g\n", vsParams[iPara], psFitParameter[iPara].Value); } } }
Thanks, Michael |
5 L A T E S T R E P L I E S (Newest First) |
Penn |
Posted - 04/05/2013 : 4:25:52 PM Hi Michael,
The link I provided includes the codes on how to get and set values to worksheet. Also, you can refer to this page on how to put the result to worksheet with normal column view or tree format view. To make it simple, the SetCell method can be your option.
Penn |
michaeli98 |
Posted - 04/03/2013 : 7:45:13 PM Hi All,
I am back onto this project. I have the script that sequentially fits the data in the active worksheet to a straight line (5 data points, 6 data points, etc.) and reports the slope, intercept, and rmse for each fit into the script window. Is there an easy way to report the results into a separate worksheet?
Here is a script that I have so far. void linearfit() {
// Get XY data from worksheet window Worksheet wks = Project.ActiveLayer(); if(!wks) return; // need to activate a worksheet with data WorksheetPage wp = wks.GetPage();
Please point me in the right direction. int nRows = wks.GetNumRows();
printf("Number of rows is %d\n", nRows);
{ for(int ii=4; ii<nRows; ii++) // ii start from 4 for the first 5 rows { DataRange dr; // declare inside the loop as local variable dr.Add("X", wks, 0, 0, ii, 0); // x column, from first row to (ii+1)th row dr.Add("Y", wks, 0, 1, ii, 1); // y column
vector vX; dr.GetData(&vX, 0); // get data of x column to vector
vector vY; dr.GetData(&vY, 1); // get data of y column to vector
// Do linear fit with the above input dataset and fit option settings int nSize = vX.GetSize(); // data size printf("Data size is %d\n", nSize);
FitParameter psFitParameter[2]; // two parameters RegStats stRegStats; // regression statistics RegANOVA stRegANOVA; // anova statistics
int nRet = ocmath_linear_fit(vX, vY, nSize, psFitParameter, NULL, 0, NULL, &stRegStats, &stRegANOVA); if(nRet != STATS_NO_ERROR) { out_str("Error"); return; } // Output analysis result to Script window, Result Log and Worksheet // print the values of fitting parameters to the Script Window vector<string> vsParams = {"Intercept", "Slope"}; for(int iPara = 0; iPara < vsParams.GetSize(); iPara++) { printf("%s = %g\n", vsParams[iPara], psFitParameter[iPara].Value); } printf("RMSE : %lf\n", stRegStats.RMSESD);
} } } |
Penn |
Posted - 07/23/2012 : 04:51:31 AM Hi Michael,
Maybe you can refer to this page.
Penn |
michaeli98 |
Posted - 07/20/2012 : 12:14:41 PM Hi Penn,
Thank you so much, moving it inside of the for-loop worked like a charm. Could you please possibly point me to an example of reporting the results? I wanted to report the slope and intercept as new columns in a separate worksheet. Is it possible to copy the x values from the first worksheet, then add the values for the slope and intercept in the new rows as the results are calculated (x(ii), slope, intercept)?
Thanks again for all your suggestions.
Best regards, Michael |
Penn |
Posted - 07/19/2012 : 10:19:27 PM Hi,
The problem is when you declare the DataRange in your code. dr is declared out the "for" loop, then for each loop, dr.Add will add pair of XY into this DataRange, and the original one is still there. Then dr.GetData will always get the first pair of XY. You can set a break point to see it.
Please move the line DataRange dr; into the "for" loop, so to make it as local variable, such as
for(int ii=5; ii<nRows; ii++)
{
DataRange dr;
dr.Add(...
By the way, the index is based of zero, in your code line dr.Add("X", wks, 1, 0, ii, 0);, it will start from the second row to the (ii+1)th row. According to your description, you wanted to fit frist 5 rows, 6, 7, 8, etc., so maybe you need to change your code as follows, please make sure this point.
for(int ii=4; ii<nRows; ii++) // ii start from 4 for the first 5 rows
{
DataRange dr; // declare inside the loop as local variable
dr.Add("X", wks, 0, 0, ii, 0); // x column, from first row to (ii+1)th row
dr.Add("Y", wks, 0, 1, ii, 1); // y column
...
Penn |
|
|