2022.10.06
验证矩阵首地址与首元素首地址的关系
验证矩阵中元素的存储方式
做以下实验
mat m;//输出矩阵头位置cout<<&m<<endl;m<<4<<6<<3<<endr<<1<<3<<1<<endr<<3<<5<<1<<endr;//输出每个元素位置for(int i=0;i<3;i++){for(int j=0;j<3;j++){cout<<&m(i,j)<<" ";}cout<<endl;}mat q;//输出矩阵头位置cout<<&q<<endl;q<<4<<6<<3<<endr<<1<<3<<1<<endr<<3<<5<<1<<endr;//输出每个元素位置for(int i=0;i<3;i++){for(int j=0;j<3;j++){cout<<&q(i,j)<<" ";}cout<<endl;}
矩阵首地址与首元素首地址总是差30H
矩阵元素位置是列优先存储,每个元素首地址间隔8H
在某些情况下,需要用到矩阵指针,例如在函数体内对矩阵赋予元素。
#include <iostream>
#include <math.h>
#include <armadillo>
using namespace std;
using namespace arma;void getmat(mat *a);
int main()
{mat *a = new mat();getmat(a);//输出每个元素及地址for(int i=0;i<3;i++){for(int j=0;j<3;j++){cout<<&a->at(i,j)<<" "<<a->at(i,j)<<" ";}cout<<endl;}
}void getmat(mat *a){mat m;m<<4<<6<<3<<endr<<1<<3<<1<<endr<<3<<5<<1<<endr;//输出每个元素及地址for(int i=0;i<3;i++){for(int j=0;j<3;j++){cout<<&m(i,j)<<" "<<m(i,j)<<" ";}cout<<endl;}cout<<endl;*a = m;}
使用指针时,赋值和取值不能再使用mat(i,j)的方式,应当使用其成员方法at,使用*mat->(i,j)的方法进行重赋值(即原有位置上已有值的情况下)和取值,需要注意的是,at不会做边界检查,访问越界元素不会报错。