如何检查两个n大小的向量是否线性依赖于C ++?

时间:2013-12-03 06:16:12

标签: c++ vector

应该制作一个程序,找出两个向量a =(a0,a1,...,an-1)和b =(b0,b1,...,bn-1)(1≤n≤ 20)是线性依赖的。输入应为n,如果向量与线性相关,则两个向量和输出的坐标应为1,否则为-0。

我现在已经在这方面挣扎了好几个小时,我什么都没有。我只知道基本的C ++内容,而且我的几何结构太糟糕了。如果有人给我写一个解决方案或者至少给我一些提示,我会非常感激。提前谢谢!

#include <iostream>
using namespace std;

int main()
{
    int n;
    double a[20], b[20];
    cin >> n;
    int counter = n;
    bool flag = false;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
        cin >> b[i];
    }
    double k;
    for (int i = 0; i < n; i++)
    {
        for (k = 0; k < 1000; k = k + 0.01)
        {
            if (a[i] == b[i])
            {
                counter--;
            }
        }
    }
    if (counter == 0 && k != 0)
        flag = true;
    cout << flag;
    return 0;
}

显然,我可能想出的就是这一切。 “for”循环在很多层面都是错误的,但我不知道如何解决它。我愿意接受建议。

2 个答案:

答案 0 :(得分:2)

问题共有四个部分:

1。数学和算法

如果∃ k ,向量 a b 是线性下降的。 a = k b 。这扩展到∃ k 。 Σ i = 1..n a i = ka i ,这是一组方程式中的任何一个都可以求解k。

所以你计算 k b 0 / a 0 并检查相同的 k 适用于其他维度。

不要忘记处理 a 0 = 0(或小,见下文)。我可能会交换向量,因此较大的绝对值是分母。

2。有限精度数值计算

由于精度有限,计算涉及舍入误差。你需要检查大致相等,而不是确切的,因为即使你期望它们,你很可能也不会得到确切的结果。

近似相等有两种形式,绝对(| x - y |&lt; ε)和相对(1 - ε&lt; | x / y |&lt; 1 +ε)。显然,亲戚在这里更有意义(你想忽略最后一个有效数字),但你必须再次处理价值太小的情况。

3。 C ++

  • 请勿使用普通数组,请使用std::vector。这样你就不会有任意限制。
  • 使用迭代器迭代,而不是索引。迭代器适用于所有容器类型,索引仅适用于少数具有连续积分索引和随机访问的索引。这基本上只是矢量和普通数组。请注意,迭代器的设计使指针成为迭代器,因此您也可以使用迭代器在普通数组上进行迭代。

4。普通老虫

你有 k 的循环,但你不使用循环内的值。

带计数器的逻辑似乎没有任何意义。我甚至都看不到你想要达到的目标。

答案 1 :(得分:0)

你是对的,该代码根本没有对问题的依赖。

比你想象的更容易(至少在概念上)。通过另一个向量中的corressponding元素划分向量中的每个元素。如果所有这些除法产生相同的数,则向量是线性相关的。因此{ 1, 2, 4 }{ 3, 6, 12 }是线性的,因为1/3 == 2/6 == 4/12

但是有两个技术问题。首先,您必须考虑当元素为零时会发生什么,您不希望除以零。

其次,因为您正在处理浮点数,所以测试两个数字是否相等是不够的。由于舍入错误,他们通常不会。所以你必须进行一些测试,看看两个数字是否接近相等。

我会让你考虑这两个问题。