我正在实现一个稀疏线性方程求解器,例如 Lx = b。为此,我初始化一个名为 x_ref 的参考 x 向量,并相应地生成一个 RHS 向量 b。但是,这两个指针似乎都是空的。
VALUE_TYPE是一个宏,设置为double
VALUE_TYPE *x_ref = (VALUE_TYPE *)malloc(sizeof(VALUE_TYPE) * n);
VALUE_TYPE *b = (VALUE_TYPE *)malloc(sizeof(VALUE_TYPE) * n);
for ( int i = 0; i < n; i++)
x_ref[i] = rand() % 10 + 1;
for (int i = 0; i < n; i++)
{
for (int j = cscColPtrTR[i]; j < cscColPtrTR[i+1]; j++)
{
int rowid = cscRowIdxTR[j]; //printf("rowid = %in", rowid);
b[rowid] += cscValTR[j] * x_ref[i];
}
}
在我将它们打印为之后;
for(int i = 0; i < n; i++)
{
printf("%dtt%dn", x_ref[i], b[i]);
}
结果是:
4226166 1977719296
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
我不明白它有什么问题。
- 而是使用
sizeof
中的对象而不是类型VALUE_TYPE *x_ref = (VALUE_TYPE *)malloc(sizeof(*x_ref) * n);
- 使用正确的
printf
格式。%d
用于输出整数,而不是双精度。
#define VALUE_TYPE double
int main(void)
{
size_t n = 20;
VALUE_TYPE *x_ref = malloc(sizeof(*x_ref) * n);
VALUE_TYPE *b = malloc(sizeof(*b) * n);
for ( int i = 0; i < n; i++)
x_ref[i] = rand() % 10 + 1;
for ( int i = 0; i < n; i++)
printf("%d - %fn", i, x_ref[i]);
}
https://godbolt.org/z/RKjZi8
首先,你不需要强制转换这些 malloc,因为它返回一个 void 指针,所以转换是隐式的。我不确定你为什么得到这些零,但有一些评论:
- 您需要为伪随机数生成器设定种子:
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
// Use current time as seed for random generator
srand(time(0));
for(int i = 0; i<4; i++)
printf(" %d ", rand());
return 0;
}
- 用内存集初始化你的 b 向量,因为它们(据我所知(正在累积值,所以它们应该从 0 开始。就像现在一样,您的向量可能只包含胡言乱语。
由于未定义的引用,我无法运行您的代码,但请考虑更正这些要点:)