2013-07-14 142 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