2017-05-12 130 views
0

我有一個對角佔優的矩陣,大小爲16000 * 16000.我想爲我的實驗提取該矩陣的前n行n列(例如前100 * 100個單元格),從而對所提取矩陣對角線仍然試圖dominant.My做到這一點是:從C++的文本文件中讀取某個偏移量

#include <stdio.h> 
#include <string.h> 
#include <mpi.h> 
#include <stdlib.h> 

int main() 
{ 

double **Matrix_A; 
FILE *fp; 
int global_size = 100; 
int offset = 0; 

if ((fp = fopen ("matrix_16000.txt", "r")) == NULL) { 
       printf("Can't open input matrix file"); 
       exit(-1); 
      } 

Matrix_A = (double **) malloc(global_size*sizeof(double *)); 
for(int irow = 0; irow < global_size; irow++) 
    { 
    offset = irow * 16000; 
    fseek(fp, offset, SEEK_SET); 
    Matrix_A[irow] = (double *) malloc(global_size * sizeof(double)); 
    for(int icol = 0; icol < global_size; icol++){ 
     fscanf(fp, "%lf", &Matrix_A[irow][icol]); 

     } 

    } 
    fclose(fp); 
    return 0; 
} 

這不會起作用,因爲偏移是不固定的,因爲矩陣,隨機生成的。知道我的編譯器是mpicc的任何更好的主意

+0

mpicc心不是一個編譯器,它的許多編譯的一個周圍的包裝......這也心不是最小編譯例如 – Vality

+0

該代碼是很長的。這僅僅是一個提取。我的意思是在運行我的代碼時,我只是使用帶默認選項的mpicc命令。 – Nawal

+1

@Nawal所以**製造** [mcve]。爲什麼我們應該投入我們的時間來幫助你,如果你連一個我們可以使用的例子都打擾不了? –

回答

1

你實際上非常接近。 fseek不會工作;相反,掃描到EOL:

int c; 
Matrix_A = (double **) malloc(global_size*sizeof(double *)); 
for(int irow = 0; irow < global_size; irow++) { 
    Matrix_A[irow] = (double *) malloc(global_size * sizeof(double)); 
    for(int icol = 0; icol < global_size; icol++){ 
     fscanf(fp, "%lf", &Matrix_A[irow][icol]); 
    } 
    while ((c = fgetc(fp)) != EOF && c != '\r' && c != '\n') {} 
} 
fclose(fp); 
+1

我可以說你用'\ r'和'\ n'代替13和10嗎?更容易解釋意圖。 – user4581301

+0

爲什麼這會得到低估? – Charlie

+0

@Charlie(可避免的),malloc()的負載,但沒有free()。 – ThingyWotsit