好吧,我正在做矩阵乘法,我需要制作一个m x n
数组和一个p x q
数组。
但是,我不知道该怎么做。
这是我的程序,当我手动输入值时打印正确的输出:
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
/*
Rows and columns for matrices.
*/
int m , n; // rows and columns of the first matrix
int p , q; // rows and columns of the second matrix
/*
1st matrix is a 2x3 matrix
*/
m = 2;
n = 3;
/*
2nd matrix is a 3x2 matrix
*/
p = 3;
q = 2;
/*
Create the matrices.
Give them values.
*/
int matrix1[m][n] = {
{2,3,4},
{5,6,7}
};
int matrix2[p][q] = {
{1,7},
{3,9},
{5,11}
};
/*
Check if we can multiple the matrices.
For matrix multiplication,
the number of COLUMNS of FIRST matrix must be equal to
the number of ROWS of SECOND matrix
*/
if(n==p){
/*
Create a new matrix.
The resulting matrix will have M rows and Q columns.
That is, the matrix is a MxQ matrix.
*/
int matrix3[2][2];
/*
We need three loops so we have 3 variables.
*/
int i = 0; // iterates over matrix1 rows
int j = 0; // iterates over matrix1 columns
int k = 0; // iterates over matrix2 rows
int l = 0; // iterates over matrix2 columns
while(i < m){
l = 0;
while(l < q){
int element = 0;
while(j < n && k < p){
element += matrix1[i][j] * matrix2[k][l];
matrix3[i][l] = element;
j++;
k++;
}
printf("\t%d",element);
l++;
j = 0;
k = 0;
}
printf("\n");
i++;
}
}else{
printf("Matrices can not be multiplied");
}
}
矩阵声明被标记为错误。 如何解决?
答案 0 :(得分:3)
我该如何解决?
首先,不使用VLA。对于此特定任务,您不需要VLA。
关于实际问题是什么:无法初始化可变长度数组。您必须逐个分配它们的元素或使用一些质量“分配”技术,例如{ {1}}。
答案 1 :(得分:1)
答案 2 :(得分:1)
在C99之前,需要在堆上显式分配变量长度数组并通过指针访问。对于矩阵问题,您有两种选择。
第一种方法是分配一个具有足够存储空间的数组,并在需要读取或修改矩阵元素时计算正确的索引。例如:
int* matrix_storage = malloc( sizeof( int ) * matrix_width * matrix_height );
// set row 0, column 1 to 0
matrix_storage[ ( 0 * matrix_width ) + ( 1 % matrix_width ) ] = 0;
或者,您可以为每个行或列分配一个指针数组:
int** rows = malloc( sizeof( (int*) ) * matrix_height );
for( int i = 0; i < matrix_height; ++i )
{
rows[i] = malloc( sizeof(int) * matrix_width );
}
row[0][1] = 0; // set row 0, column 1 to 0
这个实现浪费了一些内存,无论你选择哪种实现考虑使用函数和struct
关键字来隐藏驱动程序代码中的实现(实际上是变异或读取矩阵的代码)。
一些注意事项:我使用了c99 for
循环语法,对于较旧的编译器,int i
变量需要在for
循环之外声明。另请注意,如果您的矩阵大小可以在编译时确定(IE不依赖于用户输入),您不需要malloc的开销,并且可以硬编码您的数组大小。您发布的示例代码不需要动态分配。