如何从更大的矩阵中提取2x2子矩阵

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)

但这也不起作用:(

我究竟做错了什么 ?

请帮忙.谢谢 !

Pét*_*rök 5

好了,你想读的大小的子矩阵ñ X ,起始位置X,Ÿ规模的大矩阵p X q.你需要两件事:

  1. (验证x + n <= py + m <= q)
  2. 跳到要阅读的矩阵的第一个元素.这需要首先跳过前y - 1行
  3. 从下一行跳过x - 1个元素,然后将n个元素读入子矩阵.重复m次.

您当前的实现从矩阵的第一个元素开始读取,然后将元素连续读入子矩阵.更新版本:

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)