基本原理
书接上文用C语言实现一个矩阵,
最直接的方案就是通过数字、空格和逗号,例如
1 2 3,4 5 6, 7 8 9
即可用来代表
[ 1 2 3 4 5 6 7 8 9 ] \begin{bmatrix} 1&2&3\\4&5&6\\7&8&9 \end{bmatrix} 147258369
考虑到在矩阵运算时可能会产生的歧义,即
1 2, 3 4 + 5
这代码无法解释,故为其加上一层括号,用[a b, c d]
来创建数值矩阵。
简单起见,第一版程序要求矩阵必须通过数值来创建,从而避免了递归的麻烦。
具体实现
Matrix* NumMatrix(char *str){
int row = 0;
int nCols[MAXLEN];
nCols[0] = 1;
double* data = (double*)malloc(sizeof(double)*MAXLEN);
int i = 0;
if(str[i++]!='[')
return NULL;
int start = i;
int j = 0; //data的iter
char* temp = (char*)malloc(sizeof(char)*MAXLEN);
while(str[i]!=']'){
temp[i-start] = str[i];
if(str[i]==',' || str[i]==' '){
if(str[i]==','){
row += 1;
nCols[row] = 1;
}
else
nCols[row]+=1;
temp[i-start] = '\0';
data[j++] = atof(temp);
start = i+1;
}
i++;
}
temp[i-start]='\0';
data[j] = atof(temp);
for(i = 1; i < row; i++){
if(nCols[i-1]!=nCols[i]){
return NULL;
}
}
row++;
int col = nCols[0];
Matrix* mat = SetBase(mat);
for (i = 0; i < mat->size; i++){
mat->data[i] = data[i];
}
return mat;
}
main
函数写为
int main(){
char str[MAXLEN];
Matrix* mat;
while (1)
{
printf("please input Numbers:");
gets(str);
mat = NumMatrix(str);
printMat(mat);
}
}
测试如下:
please input Numbers:[1 2,3 4,5 6]
mat:2x3=6
1.000000,2.000000,
3.000000,4.000000,
5.000000,6.000000,
please input Numbers: