2013-03-10 103 views
1

我可以索引多维数组与单一索引?矩阵索引符号在C++

例:

在存储器

,多维数组被索引像一个单一的阵列以矩阵2×2 (例如,矩阵[1] [1]是数组的第四元件, “矩阵[ 3]“)是否有自动使用该表示法的系统?我想 想要写矩阵[3]而不是矩阵[1] [1]:有可能吗?

回答

6

根据您想要访问数据的方式,您可以轻松使用单个索引或使用两种方法。根据如何访问或使用数据,接受两个索引的方法可能是row-majorcolumn-major。当然,要做到这一点,您需要将矩阵存储在单维数组中。例如:

class Matrix { 
    int data[W*H]; 

    int get(int i) { return data[i]; } 
    int get(int x, int y) { return data[y*W+x]; } 
} 
+0

杰克漂亮的解释和很好的例子.. – 2013-03-10 17:09:01

+0

清楚!但如果我有一个三维数组? – volperossa 2013-03-10 18:02:09

+2

相同的原则适用于任何维度。唯一改变的是'int data [W * H * D]'和'int get(int x,int y,int z){return data [W * H * z + W * y + x]}'。 – Jack 2013-03-10 18:18:24

3

只是增加一个工作示例用@杰克的回答是: 对于行大和语言C(不是C++),但事情的作品一样!

#include<stdio.h> 
#define R 2 
#define C 2 
int main(){ 
    int data1[R*C]={ 1, 2, 
        3, 4 
       }; 
    int data2[R*C]={ 3, 5, 
        7, 8 
       }; 
    int result[R*C]={0 }; 
    int r,c; 
    for(r=0; r< R ; r++){ 
    for(c=0; c< C ; c++){ 
     result[r*C + c]= data1[r*C + c] + data2[r*C + c]; 
    } 
    } 
    printf("\nMatrix SUM\n"); 
    for(r=0; r< R ; r++){ 
    for(c=0; c< C ; c++){ 
     printf("%-3d ",result[r*C + c]); 
    } 
    printf("\n"); 
    } 
    return 1; 
} 

输出:

Matrix SUM 
4 7 
10 12 

你可以看到它在codpade

工作,就可以使用宏来保持索引表达式干净像下面

#define INDEX(r, c) r*C + c 

使用宏象下面这样:

data2[INDEX(r,c)]; 

你可以注意到,虽然我的例子中的所有数组都是一维的,但我的编码风格就像我正在使用二维矩阵。这不是神奇的,但是二维数组在编译器级别下以类似的方式实现。