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不会做边界检查,访问越界元素不会报错。