C ++矩阵和向量乘法Seg在尝试将它们存储为求和时出错

时间:2017-11-12 22:42:37

标签: c++ vector segmentation-fault matrix-multiplication

我正在尝试通过遵循wikipedia上找到的伪代码来计算Jacobi迭代。我已经通过gdb运行我的代码,每当我尝试计算我的矩阵和向量相乘的总和时,我发现我有一个堆缓冲区溢出。

这是我的代码:

std::vector<double> sol(std::vector<double> &x,std::vector<std::vector<double> > &A, std::vector<double> &b, int n)
{

    double sum; 
    int counter = n;
    while(counter != 0)
    {
        for (int i = 1; i <= n; ++i)
        {
            sum = 0.0;
            for (int j = 1; j <= n; ++j)
            {
                if(j != i)
                {
                    sum += A[i][j]*x[j]; //Issue seems to be here in GDB
                    std::cout << "Sum " << sum << std::endl;
                }
            }
            x[i] = (1.0/A[i][i])*(b[i]-sum);
            for(auto&& e : x)
            {
                std::cout << e << " ";
            }
            std::cout << std::endl;
        }
        counter--;
    }

    return x;
}


int main()
{

    //const int SIZE = 1000;
    const int SIZE = 2;

    double ranNumber = 0.0;
    std::vector<std::vector<double> > A;
    std::vector<double> testX = {1.0,1.0}; 
    std::vector<double> testB = {11.0,13.0};


    for (int i = 0; i < SIZE; ++i)
    {
        std::vector<double> k;
        for(int j = 0; j < SIZE; ++j)
        {
            ranNumber = randNumber();
            k.emplace_back(ranNumber);
        }
        A.emplace_back(k);
    }

    A[0][0] = 2.0;
    A[0][1] = 1.0;
    A[1][0] = 5.0;
    A[1][1] = 7.0;

    std::vector<double> xSol = sol(testX,A,testB,30);

    for(auto &&e:xSol)
    {
        std::cout << e << " ";
    }
    std::cout << std::endl;

    return 0;
}

根据维基,我应该收到答案7.1111,-3.2222,我认为我已经遵循了除k部分之外的伪代码,因为我不太确定如何将其实现为向量。

导致分段错误的原因是什么?我在向量或矩阵中走出界限了吗?这就是让我觉得我是段错误的原因,但我不确定这里到底发生了什么。任何帮助将不胜感激。

谢谢

编辑:我应该澄清一下,是的,这是一个实现矢量矢量的可怕方法。这只是一个测试,看看我是否可以复制他们在维基百科上的内容。如果我能得到这个答案,我将删除不必要的A [0] [0] ......等。我有一个随机数函数,可以为我生成数字。但这只是为了确保它正常工作。

1 个答案:

答案 0 :(得分:1)

首先,您的索引问题从0到ffmpegCommand=''' ffmpeg -f lavfi -i anullsrc=channel_layout=1c:sample_rate=11025 -rtsp_transport tcp -rtsp_transport udp -rtsp_transport http -thread_queue_size 32000 -i rtsp://xxx.xxx.xxx.xxx:554/user=admin&password=xxx&channel=1&stream=1.sdp?real_stream -reconnect 1 -reconnect_at_eof 1 -reconnect_streamed 1 -reconnect_delay_max 4294 -tune zerolatency -c:v copy -c:a aac -bufsize 6000k -f flv rtmp://a.rtmp.youtube.com/live2/xxx-xxx-xxx-xxx''' cmd=ffmpegCommand.split() # "universal newline support" This will cause to interpret \n, \r\n and \r equally, each as a newline. p = subprocess.Popen(cmd, stderr=subprocess.PIPE, universal_newlines=True) while True: print(p.stderr.readline().rstrip('\r\n')) 而不是1到n-1

然后你在main中构造你的向量A为2 x 2,但是你通过n迭代,j直到A[i][j]。所以你访问数组越界!使用30调用函数,因为您基于SIZE构造矩阵。

最后,除非先确保它不是除以零,否则除以SIZE。 (好吧,不是,但你应该验证一种反射)。

我不知道你是否能得到正确的答案,但你不应该再遇到短暂的转储。