编写一个 C 函数,sprod (n,x,y),它返回 2 个浮点类型的一维数组的标量积。该函数将数组的大小 n(类型 int 变量)和指向每个数组第一个成员的指针 x 和 y 作为输入变量,并返回一个浮点结果。main() 代码块需要调用 sprod 来计算矩阵乘积 a*b,其中浮点型矩阵 a 和浮点型向量 b 由 b=[1 1 1] 和 a=[1 2 3 4 5 6 7 8 给出9](其中 a 是一个 3x3 矩阵)。
我们可以在 af(;;) 循环中初始化 b,在双 for(;;) 循环中初始化 a(或使用大量赋值语句)。矩阵积应该通过调用函数 sprod 来计算,以形成 a 的每一行与向量 b 的标量积;指向这些行的指针由 a[1]、a[2] 和 a[3] 给出。最后,还应该使用一个 for(;;) 循环来对结果标量产品求和,并使用 printf() 函数将结果打印到屏幕上。
结果应该是矩阵 a 的所有元素的总和。还应打印矩阵 a 和向量 b 的副本。我们将使用数字食谱 C 函数 matrix() 和 vector() 以及 free_matrix() 和 free_vector() 来创建 a 和 b 作为动态定义的数组。
在编程方面,我是一个初学者,我发现我真的很烂。这是我到目前为止所拥有的,当它被编译时它像疯了一样炸毁(我知道有些东西被遗漏了)。我尝试使用 gdb 来调试它,但我也无法让它工作。任何帮助,将不胜感激。
# include <stdio.h>
# include "nrutil.h"
# include "nrutil.c"
void transp(float **a,int n);
float sprod(int n, float *x, float *y);
int main()
{
int i,j;
float var=0.0, sum=0.0, pro=0.0;
float*b, **a;
int n=3;
float index;
b=vector(0,n-1);
a=matrix(0,n-1,0,n-1);
printf("\nVector b\n");
for(j=0;j<n;j++)
{
b[j]=1;
printf("%.2f\n",b[j]);
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++);
{
var=var+1;
a[i][j]=var;
}
}
printf("\n Matrix a\n");
for(i=0;i<n;i++);
{
for(j=0;j<n;j++);
{
printf("%.2lf",a[i][j]);
}
printf("\n");
}
printf("\nProduct of Matrix a and Vector b\n");
for(i=0;i<n;i++);
{
pro=sprod(n,a[i],b);
printf("%.2f\n",pro);
sum+=pro;
}
printf("\n Sum of Product array\n");
printf("%.2f\n\n", sum);
free_ivector(index,0,n-1);
free_matrix(a,0,n-1,0,n-1);
return 0;
}
float sprod(int n, float *x, float *y)
{
float scalar=0.0;
int j=0;
int sum=0;
for(j=0;j<n;j++);
{
scalar+=x[j]*y[j];
}
return scalar;
}
自从最初发布此代码以来,我已经改进了我的代码。现在它几乎可以工作了,我只是遇到了第 50 行 free_ivector 代码的问题。终端告诉我:“free_ivector”的参数 1 的类型不兼容。我不太确定那是什么意思。该代码采用大卫邓肯在下面第一个答案中建议的整体格式。