NLe*_*Led 0 c matrix submatrix
我是一个非常基本的用户,并不太了解C中使用的命令,所以请耐心等待...我不能使用非常复杂的代码.我对stdio.h和ctype.h库有一些了解,但就此而言.我在txt文件中有一个矩阵,我想根据输入的行数和列数来加载矩阵
例如,我在文件中有一个5乘5矩阵.我想提取一个特定的2乘2子矩阵,我该怎么做?
我创建了一个嵌套循环:
FILE *sample
sample=fopen("randomfile.txt","r");
for(i=0;i<rows;i++){
for(j=0;j<cols;j++){
fscanf(sample,"%f",&matrix[i][j]);
}
fscanf(sample,"\n",&matrix[i][j]);
}
fclose(sample);
Run Code Online (Sandbox Code Playgroud)
可悲的是代码不起作用..如果我有这个矩阵:
5.00 4.00 5.00 6.00
5.00 4.00 3.00 25.00
5.00 3.00 4.00 23.00
5.00 2.00 352.00 6.00
Run Code Online (Sandbox Code Playgroud)
并输入3为行,3为列,我得到:
5.00 4.00 5.00
6.00 5.00 4.00
3.00 25.00 5.00
Run Code Online (Sandbox Code Playgroud)
不仅这不是一个2乘2的子矩阵,但即使我想要前3行和前3列,它也不能正确打印....
我需要从第3行和第3列开始,然后采用2乘2的子矩阵!
我应该最终得到:
4.00 23.00
352.00 6.00
Run Code Online (Sandbox Code Playgroud)
我听说我可以使用fgets和sscanf来实现这一目标.这是我的试用代码:
fgets(garbage,1,fin);
sscanf(garbage,"\n");
Run Code Online (Sandbox Code Playgroud)
但这也不起作用:(
我究竟做错了什么 ?
请帮忙.谢谢 !
好了,你想读的大小的子矩阵ñ X 米,起始位置X,Ÿ规模的大矩阵p X q.你需要两件事:
您当前的实现从矩阵的第一个元素开始读取,然后将元素连续读入子矩阵.更新版本:
FILE *sample = fopen("randomfile.txt", "r");
// skip the first y-1 rows
for (i = 0; i < y - 1; i++) {
fscanf(sample, "%*[^\n]\n", &matrix[i][j]);
}
for (i = 0; i < m; i++) {
// skip the first x-1 numbers
for (j = 0; j < x - 1; j++) {
fscanf(sample, "%*f");
}
// read n numbers
for (j = 0; j < n; j++) {
fscanf(sample, "%f", &matrix[i][j]);
}
if (x + n < p) {
// consume the rest of the line
fscanf(sample, "%*[^\n]\n");
}
}
fclose(sample);
Run Code Online (Sandbox Code Playgroud)
更新:从数组中读取子矩阵而不是更简单,只需要更多的计算.要点是,大小的矩阵p X q可被存储在大小的连续阵列p X q使得矩阵[I,J]可从阵列中读取[I*(J-1)+ j]的(约-可能有一个错误,我不知道哪个是列,哪个是行,但希望你能得到这个想法:-)
所以代码就像是
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
submatrix[i][j] = array[(y + i) * p + x + j];
}
}
Run Code Online (Sandbox Code Playgroud)