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
 Calculation between columns II
 New Topic  Reply to Topic
 Printer Friendly
Author Previous Topic Topic Next Topic Lock Topic Edit Topic Delete Topic New Topic Reply to Topic

Thomas83

24 Posts

Posted - 09/06/2013 :  03:24:36 AM  Show Profile  Edit Topic  Reply with Quote  View user's IP address  Delete Topic
Origin 8 SR 6; Win 7
Hi.
How can I perform some simple mathematically operations between columns of different worksheets?
I have 2 Workbooks WBK1 and WBK2, each with one worksheet. I want to multiply the first column of WBK1 with each column (subsequentially) of WBK2 and have the result in a second worksheet of WBK2. There is a "roundabout" way by copying all columns in one worksheet and use "set.formula" and "execute.formula" but this is not what I really want. BTW is it right that with "execute.formula" calculations can only be performed within a single worksheet?
Now my ideas:
First I wanted to perform a vector calculation and use the "ocmath_simple_math" method. But I did not really understand how the calculation between the vectors is carried out. I did not understand the result.
Second I want to do the calculation cell-wise by using "GetCell()".
Both ways don´t work.
Can anybody help me? What is the fault in my codes? Im trying to understand what is wrong.
BTW: It would be nice to have a general code for performing calculations ("plus, minus , ..."). Furthermore not only calculations for the 1st column of WBK1, e.g. Column(i) of WBK1 * Column(i) of WBK2.
Thanks in advance. Here the 2 codes.

1)

#include <Origin.h>
#include <ocmath.h>
#include <wksheet.h>

void Calculations_II()
{
	WorksheetPage WBK1("Book1"), WBK2("Book2");  // Set the specific Workbooks
	Worksheet wks1("[Book1]Sheet1"), wks2("[Book2]Sheet1"), wks3; //wks1, wks2 input data, wks3 results
	
	int iNumRows = wks1.Columns(0).GetNumRows(); //Get the number of Rows
        int iNumCols = wks1.GetNumCols();
	int aa = WBK2.AddLayer();
		wks3 = WBK2.Layers(aa);
		
	for (int i=1; i<=iNumCols; i++)
        {

	    Dataset dsS3(wks3,0);
	    Dataset dsS4(wks3,i);
	
	    vector vS1(iNumRows);  //number of elements in the vector =number of rows
	    vector vS2(iNumRows);	
            vector vS3(iNumRows);
	    vector vS4(iNumRows);
        
            for (int k = 0; k< iNumRows; k++)
	    {
		string value1, value2;
		int Result1 = (int) wks1.GetCell(k,0,value1);
		int Result2 = (int) wks2.GetCell(k,i,value2);
		vS1[k] = Result1;  //value of each elements of the vector
		vS2[k] = Result2;  //value of each elements of the vector

		ocmath_simple_math(iNumRows, vS3, vS4, iNumRows, vS1, vS1, iNumRows, vS2, vS2, MATHTOOL_OPT_MUL);
		dsS3 = vS3;
 		dsS4 = vS4;	
	     }
        }
}


2)

#include <Origin.h>
#include <ocmath.h>
#include <wksheet.h>

void Calculations_II()
{
	WorksheetPage WBK1("Book1"), WBK2("Book2");  // Set the specific Workbooks
	Worksheet wks1("[Book1]Sheet1"), wks2("[Book2]Sheet1"), wks3; //wks1, wks2 input data, wks3 results
	
	int iNumRows = wks1.Columns(0).GetNumRows();
	int iNumCols = wks1.GetNumCols();
	if(!WBK2)
		return;
	int aa = WBK2.AddLayer();
		wks3 = WBK2.Layers(aa);

	for (int k = 0; k<= iNumCols; k++)
	{
			for (int i = 0; i<= iNumRows; i++)
			{
				string InputA, InputB;
				double FactorA = (int) wks1.GetCell(i,0,InputA);
				double FactorB = (int) wks2.GetCell(i,k,InputB);
				double Result = FactorA * FactorB;
				wks3.SetCell(i,k,Result)
			}

	}
}

Edited by - Thomas83 on 09/06/2013 03:37:41 AM

greg

USA
1378 Posts

Posted - 09/06/2013 :  11:15:42 AM  Show Profile  Edit Reply  Reply with Quote  View user's IP address  Delete Reply
One nice thing about a Dataset is that Origin already knows how to do basic math on vectors:

void Calculations_II()
{
WorksheetPage WBK1("Book1"), WBK2("Book2");
Worksheet wks1("[Book1]Sheet1"), wks2("[Book2]Sheet1"),wks3;
int iNumRows = wks1.Columns(0).GetNumRows();
// Need this since vector multiplication expects same-size vectors
if( iNumRows != wks2.Columns(0).GetNumRows())
{
printf("Size of two datasets do not match.\n");
}
else
{
// This should be wks2 since that's what we loop over
int iNumCols = wks2.GetNumCols();
int aa = WBK2.AddLayer();
wks3 = WBK2.Layers(aa);
// We don't care about number of rows in destination
// since Origin will handle it
// But we will have to set the number of columns to match wks2
wks3.SetSize(1,iNumCols);

Dataset ds1(wks1,0); // This is the first column of [book1]sheet1
// Column indeces are from zero
// and last column is one less than column count
for (int i=0; i < iNumCols; i++)
{
Dataset ds2(wks2,i);
Dataset ds3(wks3,i);
ds3 = ds1 * ds2; // Yes, it's this simple
}
}
}

Also, I have to point out that GetCell is a function that copies the displayed string value of the cell to a string variable and returns a BOOL so something like

double FactorA = (int) wks1.GetCell(i,0,InputA);

makes no sense. The boolean gets cast to an int and assigned to a double?

Proper use would be:
string str;
BOOL bRet = wks1.GetCell(0,0,str);
double dVal1 = atof(str);
printf("%.15f\n",dVal1);
but you should be aware that the value you get is the displayed string and not the full precision. Full value can be gotten from the dataset:
double dVal2 = ds1[0];
printf("%.15f\n",dVal2);

Edited by - greg on 09/06/2013 11:19:42 AM
Go to Top of Page

Thomas83

24 Posts

Posted - 09/09/2013 :  02:12:35 AM  Show Profile  Edit Reply  Reply with Quote  View user's IP address  Delete Reply
Hi greg.
Thanks for your help. I thought I already tried the way you suggested, but it didn´t work. Maybe I did some different mistakes. However, your code works and it is what I need. Thanks again for your fast reply.
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