【发布时间】:2012-12-03 06:30:26
【问题描述】:
编写一个 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 矩阵)。
我们可以在 f(;;) 循环中初始化 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 的类型不兼容。我不太确定那是什么意思。该代码采用大卫邓肯在下面第一个答案中建议的整体格式。
【问题讨论】:
-
1.你的原型在哪里? 2. 你在代码行 11 中有一个右花括号,但你没有用任何东西填充
a[3,3]? 3. 对于没有任何论据的 lops?尝试帮助我们理解您的代码,进一步改进它! :) -
@AlbertoBonsanto:不要使用作业标签。
-
@JonathanLeffler 谢谢,我不会再使用它了,但它看起来像一个家庭作业。
-
@AlbertoBonsanto:同意,但是The homework tag is now officially deprecated。
-
原型是什么意思?大括号是一个错误,我不确定 a[3,3] 应该放什么,所以我把它留空。你应该在这里定义矩阵吗?以“float i;”开头的代码部分(中间部分)是应该创建数组的地方。之后“浮动*索引,我;”创建向量 b。这两个上面的部分是主程序。你是什么意思没有参数的循环?我以为你可以通过使用 f(;;) 创建一个无限的 for 循环?我不太了解这个,所以这可能会尽可能地改进。