У меня есть небольшая и, вероятно, тривиальная проблема под рукой при программировании в 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
… а затем хотите преобразовать второй столбец в вектор.
Решение, вероятно, будет простым, как пирог, но, поскольку я полностью новичок в Origin и Google не хотел мне помогать, я полагаюсь на это сообщество.
Редактировать: @Thomas Origin, похоже, не нравился такой код (это не C ++, но они довольно похожи). Я наполовину решил эту проблему сегодня … это означает, что она почти работает, как и планировалось, но я получаю ошибку команды каждый раз, когда я запускаю программу, сообщая мне, что индекс vectorelement-index выше верхнего предела (Ошибка источника 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);
}
2nd Edit: удалил первую часть моей функции, так как редактор не отформатировал ее правильно.
Решение: я переписал всю программу на C # …
Прочитайте четыре значения в каждой строке. Игнорируйте значения, которые вам не нужны, и поместите оставшееся значение в вектор.
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 = столбец [а + г * ч];
может быть частично учтено, потому что условие (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);
}
Вы действительно хотите?<= «как завершающее условие?
Многие за петли i = 0 ; i < LIMIT; ++i
обратите внимание на использование <
не <=
,
Других решений пока нет …