2013-07-14 137 views
1

我有一个小小的,可能无足轻重的问题,现在正在编程的原点C,但我没有发现任何有用的通过谷歌... 我想转换一列我的工作表到不同的计算步骤的矢量,也必须转换一些向量,所以我可以将它们导出为ascii文件。 可以说我有一个像这样的工作:Column to vector/vector to column,Originlab

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不想帮助我,所以我依靠这个社区。

编辑:@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); 
} 

2日编辑:删除了我的函数的第一部分,因为编辑器会对其进行格式化正确。

解决方案:我已经重写在C#中的整个程序...

+0

是否用逗号或空格分隔各列?可能有两列或四列。 –

+0

什么不起作用?哪一行产生错误?你想达到什么目的? –

+0

表达式'a + i * h'是否评估为超出数组范围的索引? –

回答

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); 
} 

声明: 如果(第(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); 
} 

你真的想要“< =”作为终止条件吗?
许多for循环是i = 0 ; i < LIMIT; ++i,请注意使用<而不是<=

+0

感谢托马斯, 那些是每行只有两个值,由空格分开。 由于它是Origin的德语版本,它使用逗号而不是点作为小数点。 明天我会试试你的代码,并告诉你它是否工作。 – user2567720

+0

对于评论部分而言,文本太长,所以我把它作为编辑置于问题中。 – user2567720

+0

对不起,我没有回应这么久。该项目现在暂时搁置... – user2567720