1

Origin C でプログラミングしているときに、ちょっとした、おそらく些細な問題が手元にありますが、Google 経由で役立つものは何も見つかりませんでした...ワークシートの列をさまざまな計算ステップのベクトルに変換したいのですが、いくつかのベクトルを変換して、それらを 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

...そして、2 番目の列をベクトルに変換します。解決策はおそらくパイのように簡単ですが、私は Origin をまったく使用したことがなく、Google は私を助けたがらなかったので、このコミュニティに頼っています。

編集: @Thomas Origin は、この種のコードが気に入らなかったようです (C++ ではありませんが、かなり似ています)。今日、この問題を半分解決しました...つまり、ほぼ計画どおりに機能していますが、プログラムを実行するたびにコマンドエラーが発生し、vectorelement-index が上限を超えていることがわかります (Origin C エラー 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# で書き直しました...

4

2 に答える 2

0

各行の 4 つの値を読み取ります。不要な値を無視して、残りの値をベクトルに入れます。

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=column[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);
}

at の値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。not の使用に注意して<ください<=

于 2013-07-14T20:23:02.797 に答える