0

1)我想将 QVector 的指针传递给一个函数,然后用它做事。我试过这个:

void MainWindow::createLinearVector(QVector<float> *vector, float min, float max )
{
    float elementDiff=(max-min)/(vector->size()-1);

    if(max>min) min -= elementDiff;
    else        min += elementDiff;

    for(int i=0; i< vector->size()+1 ; i++ )
    {
        min += elementDiff;
        *(vector+i) = min; //Problematic line
    }

}

但是,编译器给了我 “与 operator =" 不匹配*(vector+i) = min;行。在 QVector 上执行此类操作的最佳方法是什么?

2) 该函数应该以 matlab : 运算符的工作方式在绘图的向量上线性分布值,例如 vector(a:b:c)。在 Qt 中执行此类操作的最简单和最好的方法是什么?

编辑:

有了这里的帮助,最初的问题就解决了。:)

我也改进了方法本身。通过使用线性插值而不是像上面那样的多次加法,可以大大提高精度。多次加法会累积误差,这在很大程度上通过线性插值消除。

顺便说一句,第一个函数中的 if 语句是不必要的,即使在多重加法方法中也可以通过重新排列一些东西来删除。

void MainWindow::createLinearVector(QVector<double> &vector, double min, double max )
{
    double range = max-min;
    double n =   vector.size();

    vector[0]=min;

    for(int i=1; i< n ; i++ )
    {
        vector[i] = min+ i/(n-1)*range;
    }
}

我考虑过为此使用一些增强的循环,但它会更实用吗?例如,对于一个 foreach 循环,我仍然需要为插值增加一些变量,对吗?并且还为跳过第一个元素设置条件?

4

3 回答 3

5

我想在 QVector 中的某个位置放置一个浮点数。

然后使用这个:

(*vector)[i] = min; //Problematic line

向量是指向 QVector 的指针,*vector将是 QVector,它可以[i]像任何 QVector 一样被指示。但是,由于优先级,需要括号来获得正确的操作顺序。

于 2014-01-05T23:02:55.560 回答
1

对,所以在这里使用 QVector 指针没有多大意义。原因如下:

  • 如果隐式共享对您来说不够快,则使用方法参数的引用应该更像 C++'ish。

  • 虽然,在大多数情况下,您甚至不需要引用,只需传递参数而不将结果返回到相同的参数(即输出参数)。这是因为 *QVector 是隐式共享的,并且副本仅发生在按照文档的写入时。幸运的是,在这两种情况下,方法的调用和内部实现的语法是相同的,因此很容易从一种更改到另一种。

  • 使用智能指针而不是原始指针更可取,但在我看来,这两者都是不必要的复杂解决方案。

因此,我建议将您的代码重构为:

void MainWindow::createLinearVector(QVector<float> &vector, float min, float max)
{
    float elementDiff = (max-min) / (vector.size()-1);

    min += ((max>min) ? (-elementDiff) : elementDiff)

    foreach (float f, vector) {
        min += elementDiff;
        f = min;
    }
}

请注意,我在您的代码中修复了以下内容:

  • 引用类型参数而不是指针

  • "->" 成员解析为 "." 分别

  • 在这种情况下,三元运算而不是不自然的 if/else

  • Qt 的 foreach 而不是低级索引,在这种情况下,您的原始观点变得毫无意义

这就是您从调用者调用方法的方式:

createLinearVector(vector, fmin, fmax);
于 2014-01-06T01:09:54.123 回答
1

我认为,首先你需要对这些东西使用可变迭代器:Qt doc link

像这样的东西:

QMutableVectorIterator<float> i(vector);
i.toBack();
while (i.hasPrevious())
    qDebug() << i.{your code}
于 2014-01-05T22:11:19.617 回答