首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列到矢量/矢量到列,Originlab

列到矢量/矢量到列,Originlab
EN

Stack Overflow用户
提问于 2013-07-15 03:10:37
回答 2查看 587关注 0票数 1

在用Origin C编程时,我手头有一个小问题,可能也是微不足道的,但我没有通过google找到任何有用的东西。我想要将工作表中的列转换为矢量,用于不同的计算步骤,而且我还必须转换一些矢量,以便将它们导出为ascii文件。假设我有一个这样的工作表:

代码语言:javascript
复制
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++,但它们非常相似)。我今天解决了这个问题的一半...这意味着它几乎可以按计划工作,但每次运行程序时,我都会收到一个命令错误,告诉我向量索引高于上限(Origin C错误24)。虽然它没有告诉我错误发生的确切位置,但我认为它在这个小函数中

代码语言:javascript
复制
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);
}

第二次编辑:删除了我函数的第一部分,因为编辑器不能正确地格式化它。

解决方案:我用C#重写了整个程序...

EN

回答 2

Stack Overflow用户

发布于 2013-07-15 04:23:03

阅读每一行上的四个值。忽略不需要的值,并将剩余的值放入一个向量中。

代码语言:javascript
复制
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:代码片段分析

代码:

代码语言:javascript
复制
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=columna+i*h;可以部分分解出来,因为条件(i == 0)是一个初始化,所以循环看起来像这样:

代码语言:javascript
复制
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在循环中是常量,因此创建一个常量。

代码语言:javascript
复制
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次,因此可以使用另一个变量来减少它。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-09-05 18:12:52

这样试一下(你可以调整参数):

代码语言:javascript
复制
    //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).

或者:

代码语言:javascript
复制
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 
        }
    }

有关以下内容的更多信息:

Origin C: column constructor

Origin C: dataset constructor

Origin C: vector constructor

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17642728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档