Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查两个n个大小的向量是线性依赖于C++的?_C++_Vector - Fatal编程技术网

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

如何检查两个n个大小的向量是线性依赖于C++的?,c++,vector,C++,Vector,应编制一个程序,确定两个向量A=a0,a1,…,an-1和b=b0,b1,…,bn-1≤ N≤ 20个是线性相关的。输入应为n,如果向量线性相关,则两个向量和输出的坐标应为1,否则为-0 我已经为此挣扎了好几个小时,但我一无所有。我只知道基本C++的东西和我的几何学太多。如果有人能给我写一个解决方案或者至少给我一些提示,我会非常感激。提前谢谢 #include <iostream> using namespace std; int main() { int n; d

应编制一个程序,确定两个向量A=a0,a1,…,an-1和b=b0,b1,…,bn-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循环在很多级别上都是错误的,但我不知道如何修复它。我愿意接受建议。

你是对的,代码对问题根本没有任何影响

至少在概念上,这比你想象的要容易。将向量中的每个元素除以另一个向量中相应的元素。如果所有这些除法的结果是相同的数,那么向量是线性相关的。所以{1,2,4}和{3,6,12}是线性的,因为1/3==2/6==4/12

然而,有两个技术问题。首先,你必须考虑当你的元素为零时发生什么,你不想除以0。 第二,因为您处理的是浮点数,所以仅测试两个数是否相等是不够的。由于舍入误差,它们通常不会被舍入。所以你必须做一些测试,看看两个数字是否几乎相等


我将让您思考这两个问题。

问题有四个部分:

1.数学与算法 向量a和b是线性相关的,如果∃Ka=kb。扩展到∃K∑i=1..n ai=k ai,这是一组方程,其中任何一个都可以为k求解

因此,将k计算为b0/a0,并检查相同的k是否适用于其他尺寸

不要忘记处理a0=0或较小的值,请参见下文。我可能会交换向量,这样更大的绝对值就是分母

2.有限精度数值计算 由于精度有限,计算涉及舍入误差。您需要检查近似相等,而不是精确相等,因为即使在您预期的情况下,也很可能无法得到精确的结果

近似等式有两种形式,绝对的| x-y |<ε和相对的1-ε 3.C++ 不要使用普通数组,使用std::vector。这样你就不会有任意的限制。 使用迭代器而不是索引进行迭代。迭代器适用于所有容器类型,索引仅适用于具有连续整数索引和随机访问的少数容器类型。基本上就是向量和平面数组。请注意,迭代器的设计使得指针是迭代器,所以您也可以使用迭代器在普通数组上进行迭代。 4.普通老虫子 在k上有循环,但不在循环内使用值


计数器的逻辑似乎没有任何意义。我甚至不知道你想用它实现什么。

线性相关?你是说a=KB吗?你了解测试两个浮点数是否相等的问题吗?我只知道,如果x1*v1+x2*v2=0,向量v1和v2是线性相关的,假设x1和x2是随机数,但事实上仅此而已。我已经连续两个小时在谷歌上搜索了,结果什么也没找到。你对这些坐标和矩阵一无所知。@user3060096你的语句在数学上等同于Beta的语句,只是Beta的语句要简单得多。k=-x1/x2。测试版应该告诉您如何实现这一点。虽然如果你在学习浮点数,这是一个值得关注的问题。我假设你是一名学生,所以寻找答案的地方不是谷歌或堆栈溢出,而是你为课程提供的材料、教授该课程的人以及你的同学。首先,确保你知道你所使用的所有术语的定义,足以教给其他人。一旦你理解了线性独立性,这里唯一棘手的事情就是,正如@Beta所指出的,回顾一下你所知道的关于浮点数相等的知识。祝你好运我真的不知道这个网站是怎么运作的,如果我太无礼,我很抱歉,但我想告诉你们,我更新了我的问题。