我在Origin C中编程时遇到了一个小问题,可能还有一些微不足道的问题但是我没有通过谷歌找到任何有用的东西...... 我想将我的工作表中的列转换为不同计算步骤的向量,我还要转换一些向量,以便将它们导出为ascii文件。 假设我有一个这样的工作表:
1299,9001 175156,7021
1300,2001 175431,5957
1300,5001 175704,2139
1300,8001 175970,9028
1301,1001 176228,0081
1301,4001 176471,8757
1301,7001 176699,8998
1302,0001 176917,9282
1302,3001 177135,8932
1302,6001 177363,7539
...然后想要将第二列转换为矢量。 解决方案可能很简单,但由于我对Origin完全不熟悉而Google不想帮助我,所以我依赖这个社区。 p>
编辑:@Thomas Origin似乎不喜欢这种代码(它不是C ++,但它们非常相似)。我今天半解决了这个问题...这意味着它几乎按计划工作但每次我运行程序时都会收到命令错误,告诉我vectorelement-index超过了上限(Origin C error 24)。它没有告诉我错误发生在哪里,但我认为这是在这个小功能
for (int i=0; i<=2*n; ++i)
{
if ((i==0) || (i==2*n))
sum0=column[a+i*h];
if (i%2==1)
sum1=column[a+i*h];
if ((i%2==0) && (i!=2*n))
sum2=column[a+i*h];
vsimpson[i]=(h/3)*(sum0+4*sum1+2*sum2);
}
2nd Edit:删除了我的函数的第一部分,因为编辑器不能正确格式化。
解决方案:我用C#重写了整个程序......
答案 0 :(得分:0)
读取每行的四个值。忽略您不想要的值,并将剩余的值放入向量中。
std::vector<unsigned int> vector_column_2;
std::vector< std::pair<unsigned int, unsigned int> > vector_pair_column_2;
unsigned int column1, column2, column3, column 4;
char comma1, comma2;
//...
while (data_file >> column1 >> comma1 >> column2 >> column3 >> comma2 >> column4)
{
vector_column_2.push_back(column_2);
std::pair<unsigned int, unsigned int> col2_pair;
col2_pair.first = column3;
col2_pair.second = column4;
vector_pair_column_2.push_back(col2_pair);
}
编辑1:代码片段分析
代码:
for (int i=0; i<=2*n; ++i)
{
if ((i==0) || (i==2*n))
sum0=column[a+i*h];
if (i%2==1)
sum1=column[a+i*h];
if ((i%2==0) && (i!=2*n))
sum2=column[a+i*h];
vsimpson[i]=(h/3)*(sum0+4*sum1+2*sum2);
}
声明:
if((i == 0)||(i == 2 * n))
SUM0 =柱[A + I * H];
可以部分考虑因为条件(i == 0)
是初始化,所以循环看起来像:
sum0 = column[a]; // remember i==0, so i*h cancels out.
for (int i=0; i<=2*n; ++i)
{
if (i==2*n)
sum0=column[a+i*h];
if (i%2==1)
sum1=column[a+i*h];
if ((i%2==0) && (i!=2*n))
sum2=column[a+i*h];
vsimpson[i]=(h/3)*(sum0+4*sum1+2*sum2);
}
值2*n
是常量,因此请创建一个
索引表达式a + i * h
在循环中是常量,因此创建一个常量。
const unsigned int LIMIT = 2 * n; // or n << 1
sum0 = column[a]; // remember i==0, so i*h cancels out.
for (int i=0; i<=LIMIT; ++i)
{
const unsigned int row = a + i * h;
if (i==LIMIT)
sum0=column[row];
if (i%2==1)
sum1=column[row];
if ((i%2==0) && (i!=LIMIT))
sum2=column[row];
vsimpson[i]=(h/3)*(sum0+4*sum1+2*sum2);
}
column[row]
的值被访问3次,因此使用另一个变量来减少它。
const unsigned int LIMIT = 2 * n; // or n << 1
sum0 = column[a]; // remember i==0, so i*h cancels out.
for (int i=0; i<=LIMIT; ++i)
{
const unsigned int row = a + i * h;
const double value = column[row];
if (i==LIMIT)
sum0=value;
if (i%2==1)
sum1=value;
if ((i%2==0) && (i!=LIMIT))
sum2=value;
vsimpson[i]=(h/3)*(sum0+4*sum1+2*sum2);
}
你真的想要“&lt; =”作为终止条件吗?
许多for循环都是i = 0 ; i < LIMIT; ++i
,请注意使用<
而不是<=
。
答案 1 :(得分:0)
以这种方式尝试(您可以调整参数):
//select the current active worksheet
//select the first column int the wks worksheet. Attention first column is the 0.
int column_to_vector()
{
Worksheet wks=Project.ActiveLayer();
Column col(wks, 0);
vector v(col, 2, 5, WRITEBACK_DELETE_ON_SHRINK | WRITEBACK_INSERT_ON_EXPAND);
}
//select values between 2. and 5. row (including). Attention first row is the 0. Type -1,-1 for select all rows (probably you need this).
或:
void column_to_vector()
{
Worksheet wks=Project.ActiveLayer();
if (wks)
{
Dataset dsB(wks,1);
dsB.SetSize(5); // Set sizeof data set to 5
dsB[0]=-1; // You can change the values in rows and its size
dsB[1]=5;
dsB[2]=NANUM; // Missing value will be removed
dsB[3]=NANUM; // Missing value will be removed
dsB[4]=23;
vector vB( dsB, TRUE ); // Copy Dataset dsD to vector vD removing missing values
printf("The size of vB is %d", vB.GetSize()); // Elements dsB[2] and dsB[3] are removed
}
}
有关更多信息: