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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 要输出MATLAB数据每个像素的值,可以使用MATLAB编程语言。首先,需要读取MAT文件并获取图像变量的值。然后,根据图像变量的维度,可以使用循环来遍历每个像素并输出其值。 假设MAT文件的图像变量名为img,并且它是一个维矩阵。 ``` % 读取MAT文件 load('file.mat'); % 获取图像变量的尺寸 [height, width] = size(img); % 遍历每个像素,并输出其值 for i = 1:height for j = 1:width pixelValue = img(i, j); disp(['Pixel at (' num2str(i) ',' num2str(j) ') = ' num2str(pixelValue)]); end end ``` 以上代码假定MAT文件已经加载到MATLAB工作区,并且图像变量名为img。通过使用两个嵌套的循环,代码遍历了图像的每个像素,并使用disp函数输出了每个像素的值。 请注意,以上的代码适用于维矩阵,如果图像是多维的,需要根据图像的维度进行相应的修改。这个例子仅仅是一个简单的示例来回答问题,实际应用可能需要根据具体需求进行更多的处理。 ### 回答2: 要输出mat数据的每一个像素值,首先需要确认mat是一个什么类型的数据结构。在OpenCVmat是一个多维数组,存储像素值的类型可以是单通道或多通道的。这里以单通道的情况为例。 在输出像素值之前,首先要确定mat的尺寸大小(宽度和高度),以确定需要遍历的像素数。可以通过mat.rows和mat.cols来获取。 然后,可以使用双重循环来遍历mat的每一个像素。外层循环控制行数,内层循环控制列数。 在循环,可以使用mat.at<数据类型>(行索引, 列索引)来获取对应位置的像素值。例如,若mat是一个CV_8UC1类型的mat,表示像素值范围为0-255的灰度图像,则可以使用mat.at<uchar>(i, j)来获取(i, j)位置的像素值。 在循环输出每一个像素值,可以使用cout或者其他适合的输出方式,将像素值打印出来。 下面是一个简单的示例代码: ```cpp #include <iostream> #include <opencv2/opencv.hpp> int main() { cv::Mat mat = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE); // 读取灰度图像 int rows = mat.rows; int cols = mat.cols; for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { uchar pixel_value = mat.at<uchar>(i, j); std::cout << "Pixel value at (" << i << ", " << j << "): " << static_cast<int>(pixel_value) << std::endl; } } return 0; } ``` 上述代码使用OpenCV库读取一个灰度图像,并输出每一个像素的值。在实际应用,需要根据具体的需求对代码进行修改和优化。 ### 回答3: 要输出MATLAB维矩阵数据mat的每一个像素值,首先我们需要将该维矩阵转化为MATLAB的图像矩阵。接下来,我们可以使用MATLAB的循环结构来遍历图像矩阵的每一个像素,并输出其值。 具体步骤如下: 1. 首先,将MATLAB维矩阵mat转化为图像矩阵,可以使用im2uint8()函数将其转化为8位整型矩阵。 img = im2uint8(mat); 2. 然后,获取图像矩阵的行数和列数,以便遍历每个像素。 [rows, cols] = size(img); 3. 使用两个嵌套的循环结构来遍历图像矩阵的每一个像素,并输出其值。 for i = 1:rows for j = 1:cols pixel_value = img(i, j); disp(['Pixel at position (', num2str(i), ',', num2str(j), ') has value: ', num2str(pixel_value)]); end end 通过以上步骤,我们可以逐个输出矩阵mat每个像素的值。代码,我们使用disp()函数将输出结果显示在命令行窗口,并使用num2str()函数将数值转化为字符串以输出。最后的输出结果将包括每个像素的位置和相应的像素值。 需要注意的是,上述代码是在MATLAB环境运行的,如果您需要在其他编程环境实现类似的功能,可以根据具体的编程语言语法进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值