2010-05-09 23 views
0

提取2×2子矩陣是一個很基本的用戶,不知道太多關於在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); 

可悲的是代碼不起作用。如果我有這樣的矩陣:

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 

並輸入列3行和3,我得到:

5.00 4.00 5.00 
6.00 5.00 4.00 
3.00 25.00 5.00 

不僅這不是一個2乘2的子矩陣,但即使我想要前3行和前3列,它不正確地打印出來....

我需要3行和第3欄開始,然後坐2×2子矩陣!

我應該已經結束了:

4.00 23.00 
352.00 6.00 

聽說我可以用fgets和sscanf做到這一點。這裏是我的審判代碼:

fgets(garbage,1,fin); 
sscanf(garbage,"\n"); 

但是,這並不工作要麼:(

我在做什麼錯

請幫 感謝

+1

爲什麼要刪除這個問題的最後一次你發佈了嗎? http://stackoverflow.com/questions/2796071/how-to-extract-a-submatrix-from-a-matrix如果你刪除你的問題,它使人們不太可能會花時間給出好的答案。 – 2010-05-09 13:36:18

+1

我在這個問題上犯了一個錯誤,我想要一個2by2子矩陣(我的錯誤) – NLed 2010-05-09 13:37:28

+0

未來,如果在你的問題中有一個錯誤,你最好糾正它,而不是做一個全新的職位。 – dbyrne 2010-05-09 13:49:31

回答

4

OK,所以你要!讀取尺寸爲的子矩陣n x m,從位置x,y在尺寸p X q的大矩陣。需要兩件事情:

  1. (驗證X + Ñ < = pÿ < = q
  2. 跳到的第一元件矩陣你想讀。這需要先跳過第一Ÿ - 1行
  3. 跳過X - 從下一行1個元素,然後讀ň元素融入你的小矩陣。重複倍。

您當前的實現從矩陣的第一個元素開始讀取,然後將元素連續讀入子矩陣。一個更新版本:

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); 

更新:來讀取一個數組的小矩陣,而不是更簡單,只是需要多一點的計算。要點是,大小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]; 
    } 
} 
+0

感謝您的回覆。如果矩陣是50x25,該怎麼辦?我將使用行還是列進行比較? n = 2,x + 2 <50或x + 2 <25? – NLed 2010-05-09 13:54:12

+0

@ZaZu,只是更新了一般情況下的尺寸。 – 2010-05-09 13:55:45

+0

非常感謝,我的代碼結果有點類似,但是我忘了將它讀入一個新的矩陣中。我有一個問題,但如果大矩陣不是文件的一部分呢?如果用戶在數組中輸入矩陣,然後需要從中提取一個子矩陣,該怎麼辦? scanf語法將如何改變? – NLed 2010-05-09 14:18:33

1

讓我們分階段。首先一對夫婦的小修復到您的代碼:

for(i=0;i<rows;i++){ 
    for(j=0;j<cols;j++){ 
    float dummy; /* this will make thing easier later */ 
    fscanf(sample,"%f",&dummy); 
    matrix[i][j] = dummy; 
    } 
/* fscanf(sample,"\n",&matrix[i][j]); this isn't even legal */ 
} 

現在我們定義我們想要的東西:

int startrow = 2; /* The starting index. Remember we index 0,1,2,3 */ 
int startcol = 2; 
int resultrows = 2; /* How many rows we want in our answer */ 
int resultcols = 2; 
float result[resultrows][resultcols]; 

現在我們忽略我們不想要的東西:

for(i=0;i<rows;i++){ 
    for(j=0;j<cols;j++){ 
    float dummy; 
    fscanf(sample,"%f",&dummy); 
    if(i >= startrow && i < startrow + resultrows && 
     j >= startcol && j < startcol + resultcols){ 
     matrix[i][j] = dummy; 
    } 
    } 
} 

注意現在只有我們想要的值被複制到matrixmatrix的其餘部分是未初始化的亂碼。現在,它寫入result代替:

for(i=0;i<rows;i++){ 
    for(j=0;j<cols;j++){ 
    float dummy; 
    fscanf(sample,"%f",&dummy); 
    if(i >= startrow && i < startrow + resultrows && 
     j >= startcol && j < startcol + resultcols){ 
     result[i-startrow][j-startcol] = dummy; 
    } 
    } 
} 

編輯:
如果你想一個小矩陣從已在內存較大的矩陣複製,內環應

for(j=0;j<cols;j++){ 
    if(i >= startrow && i < startrow + resultrows && 
    j >= startcol && j < startcol + resultcols){ 
     result[i-startrow][j-startcol] = matrix[i][j]; 
    } 
} 
+0

非常感謝您花時間寫這篇文章,我正在測試這個,並希望我能讓它工作。謝謝 – NLed 2010-05-09 14:45:31

+0

我嘗試過使用你的方法,但我更喜歡彼得的方式,因爲它的方式類似於我的課程。謝謝你,雖然,真的很感激它。 – NLed 2010-05-09 15:43:21

1

的訣竅是使編譯器將特定的數組元素作爲矩陣的起點;下面的代碼片段做的是:

(int(*)[SIZE_OF_2ND_DIM])(&a[4][3]) 

下面的程序捕獲預期的目的:

#include <stdio.h> 

int num; 

void print(int a[][num], int row, int col) 
{ 
    int i, j; 
    for(i = 0; i < row; i++) 
    { 
    for(j = 0; j < col; j++) 
     printf("%3d ", a[i][j]); 
    printf("\n"); 
    } 
} 


int main() 
{ 
    int a[10][10]; 
    int i, j; 

    for(i = 0; i < 10; i++) 
    for(j = 0; j < 10; j++) 
     a[i][j] = i*10+j; 

    num = 10; 
    print(a, 10, 10); 

    printf("\n\n"); 

    print((int(*)[num])(&a[4][3]), 5, 4); 

    return 0; 
} 

下面是相應的輸出:

0 1 2 3 4 5 6 7 8 9 
10 11 12 13 14 15 16 17 18 19 
20 21 22 23 24 25 26 27 28 29 
30 31 32 33 34 35 36 37 38 39 
40 41 42 43 44 45 46 47 48 49 
50 51 52 53 54 55 56 57 58 59 
60 61 62 63 64 65 66 67 68 69 
70 71 72 73 74 75 76 77 78 79 
80 81 82 83 84 85 86 87 88 89 
90 91 92 93 94 95 96 97 98 99 


43 44 45 46 
53 54 55 56 
63 64 65 66 
73 74 75 76 
83 84 85 86 
相關問題