c++输出mat文件(二)

c++输出mat文件(二)

数组输出:由于C系语言中矩阵按行存储,Matlab按列存储,因此需要进行转换。
对于数组a[m][n](方便起见,假设C++也从下标1开始)
C++: a[1][1], a[1][2], …, a[1][n], a[2][1], a[2][2], …, a[2][n], …, a[m][1], a[m][2], …, a[m][n]
Matlab: a[1][1], a[2][1], …, a[m][1], a[1][2], a[2][2], …, a[m][2], …, a[1][n], a[2][n], …, a[m][n]

1. 一维数组转换

很显然,对于一维数组a[m],c++与matlab并不存在差异,直接调用函数即可

double data[len];
mxArray* pMxArray = mxCreateDoubleMatrix(len, 1, mxREAL);
setData(pMxArray, data);
putVariable("array1D", pMxArray);

2. 二维数组转换

从二维数组开始,需要通过重新组合排列方式才能达到相同的矩阵形状
假设二维数组a[m][n]
C++: a[i][j] : i * n + j
MAtlab: a[i][j] : j * m + i

double data[row*col]; // 相当于二维数组data[row][col];
mxArray* pMxArray = mxCreateDoubleMatrix(row, col, mxREAL);
std::vector<double> datatrans(row * col);
for (size_t i = 0; i < row; i++) {
	for (size_t j = 0; j < col; j++) {
		datatrans[j * row + i] = data[i * col + j];
	}
}
setData(pMxArray, datatrans.data());
putVariable("matrix2D", pMxArray);

3. 高维数组的转换

高维数组指大于等于3个维度的数组
对于数组 double *data; 其共有ndim个维度, 每个维度的大小为dims{dim1,dim2,dim3…}

int ndim;
int dims[ndim];

size_t size = 1;
for (int i = 0; i < ndim; i++) size *= dims[i];

double data[size];
std::vector<double> datatrans(size);

std::vector<long> arrayhelperC(ndim); // for c++, pos = i * arrayhelperC[0] + j * arrayhelperC[1] + ...
arrayhelperC[ndim - 1] = 1;
for (int i = ndim - 2; i >= 0; i--) arrayhelperC[i] = arrayhelperC[i + 1] * dims[i + 1];

std::vector<long> arrayhelperMat(ndim); // for MATLAB, pos = i * arrayhelperMat[0] + j * arrayhelperMat[1] + ...
arrayhelperMat[0] = 1;
for (int i = 1; i < ndim; i++) arrayhelperMat[i] = arrayhelperMat[i - 1] * dims[i - 1];

for (size_t cn = 0; cn < size; cn++) {
	size_t temp = cn, mn = 0;
	for (int i = 0; i < ndim; i++) {
		size_t index = temp / arrayhelperC[i];
		temp -= index * arrayhelperC[i];
		mn = mn + index * arrayhelperMat[i];
	}

	datatrans[mn] = data[cn];
}
mxArray* pMxArray = mxCreateNumericArray(ndim, dims, mxDOUBLE_CLASS, mxREAL);
setData(pMxArray, datatrans.data());
putVariable("ArrayDimn", pMxArray);
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值