我正在尝试通过遵循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] ......等。我有一个随机数函数,可以为我生成数字。但这只是为了确保它正常工作。答案 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
。 (好吧,不是,但你应该验证一种反射)。
我不知道你是否能得到正确的答案,但你不应该再遇到短暂的转储。