Столбец к вектору / вектор к столбцу, Originlab

У меня есть небольшая и, вероятно, тривиальная проблема под рукой при программировании в 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#...

1 ответ

Прочитайте четыре значения в каждой строке. Игнорируйте значения, которые вам не нужны, и поместите оставшееся значение в вектор.

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

Значение в 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обратите внимание на использование < не <=,

Попробуйте так (параметры можно настроить):

    //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 
        }
    }

Подробнее о:

Источник C: конструктор столбца,

Источник C: конструктор набора данных,

Происхождение C: векторный конструктор

Другие вопросы по тегам