gpt4 book ai didi

c - Matlab MEX 文件 - 索引正确,UINT32 值不正确

转载 作者:太空宇宙 更新时间:2023-11-04 02:41:08 25 4
gpt4 key购买 nike

这是我上一个问题的下一步 here

使用与我的问题相同的 Matlab 测试矩阵:

这里是测试矩阵代码:

%Create a 4D array 2x,2y, rgb(3), framenumber(from 1 to 5)
%Framenumber from 1 to 5

testmatrix(1,1,1,1) = 0;
testmatrix(1,1,1,2) = 1;
testmatrix(1,1,1,3) = 2;
testmatrix(1,1,1,4) = 3;
testmatrix(1,1,1,5) = 4;

testmatrix(1,1,2,1) = 5;
testmatrix(1,1,2,2) = 6;
testmatrix(1,1,2,3) = 7;
testmatrix(1,1,2,4) = 8;
testmatrix(1,1,2,5) = 9;

testmatrix(1,1,3,1) = 10;
testmatrix(1,1,3,2) = 11;
testmatrix(1,1,3,3) = 12;
testmatrix(1,1,3,4) = 13;
testmatrix(1,1,3,5) = 14;

testmatrix(1,2,1,1) = 15;
testmatrix(1,2,1,2) = 16;
testmatrix(1,2,1,3) = 17;
testmatrix(1,2,1,4) = 18;
testmatrix(1,2,1,5) = 19;

testmatrix(1,2,2,1) = 20;
testmatrix(1,2,2,2) = 21;
testmatrix(1,2,2,3) = 22;
testmatrix(1,2,2,4) = 23;
testmatrix(1,2,2,5) = 24;

testmatrix(1,2,3,1) = 25;
testmatrix(1,2,3,2) = 26;
testmatrix(1,2,3,3) = 27;
testmatrix(1,2,3,4) = 28;
testmatrix(1,2,3,5) = 29;

testmatrix(2,1,1,1) = 30;
testmatrix(2,1,1,2) = 31;
testmatrix(2,1,1,3) = 32;
testmatrix(2,1,1,4) = 33;
testmatrix(2,1,1,5) = 34;

testmatrix(2,1,2,1) = 35;
testmatrix(2,1,2,2) = 36;
testmatrix(2,1,2,3) = 37;
testmatrix(2,1,2,4) = 38;
testmatrix(2,1,2,5) = 39;

testmatrix(2,1,3,1) = 40;
testmatrix(2,1,3,2) = 41;
testmatrix(2,1,3,3) = 42;
testmatrix(2,1,3,4) = 43;
testmatrix(2,1,3,5) = 44;

testmatrix(2,2,1,1) = 45;
testmatrix(2,2,1,2) = 46;
testmatrix(2,2,1,3) = 47;
testmatrix(2,2,1,4) = 48;
testmatrix(2,2,1,5) = 49;

testmatrix(2,2,2,1) = 50;
testmatrix(2,2,2,2) = 51;
testmatrix(2,2,2,3) = 52;
testmatrix(2,2,2,4) = 53;
testmatrix(2,2,2,5) = 54;

testmatrix(2,2,3,1) = 55;
testmatrix(2,2,3,2) = 56;
testmatrix(2,2,3,3) = 57;
testmatrix(2,2,3,4) = 58;
testmatrix(2,2,3,5) = 59;

testmatrix = uint8(testmatrix);

我创建了以下 Mex 文件:

    #include <stdint.h>
#include "mex.h"

void
mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
//Check - expect 1 input, expect 1 outputs
if (nrhs != 1) {
mexErrMsgIdAndTxt( "MATLAB:24bit_pixel_from_uint8_rgb:invalidNumInputs",
"One input argument required.");
}
if (nlhs > 1) {
mexErrMsgIdAndTxt( "MATLAB:24bit_pixel_from_uint8_rgb:maxlhs",
"Too many output arguments.");
}

//declare variables
mwSize *dim_array, dims;
mxArray *a_in_m, *b_out_m;
uint8_T *a,b;
int X,Y,RGB,FRAMENUMBER;
int X_INDX,Y_INDX,RGB_INDX,FRAMENUMBER_INDX;

dims = mxGetNumberOfDimensions(prhs[0]);
dim_array = mxGetDimensions(prhs[0]);
X = dim_array[0];
Y = dim_array[1];
RGB = dim_array[2];
FRAMENUMBER = dim_array[3];
mexPrintf("dims: %d\n",dims);
mexPrintf("X: %d\n",X);
mexPrintf("Y: %d\n",Y);
mexPrintf("RGB: %d\n",RGB);
mexPrintf("FRAMENUMBER: %d\n",FRAMENUMBER);

a = mxGetData(prhs[0]);
mexPrintf("a is: %d\n",a[0]); //IS zero, now the other values aren't what I expected...

b_out_m = plhs[0] = mxCreateNumericArray(dims, dim_array, mxUINT32_CLASS, 0);
//b = mxGetData(b_out_m);

int linear_index = 0;
for(X_INDX=0;X_INDX<X;X_INDX++)
{
for(Y_INDX=0;Y_INDX<Y;Y_INDX++)
{
for(RGB_INDX=0;RGB_INDX<RGB;RGB_INDX++)
{
for(FRAMENUMBER_INDX=0;FRAMENUMBER_INDX<FRAMENUMBER;FRAMENUMBER_INDX++)
{
mexPrintf("Linear Index: %u\n",linear_index);
mexPrintf("Value[%u]: %u\n",FRAMENUMBER_INDX + (RGB_INDX*FRAMENUMBER)+(Y_INDX*RGB*FRAMENUMBER)+(X_INDX*Y*RGB*FRAMENUMBER),(uint8_T)a[linear_index]);//FRAMENUMBER_INDX + (RGB_INDX*FRAMENUMBER)+(Y_INDX*RGB*FRAMENUMBER)+(X_INDX*Y*RGB*FRAMENUMBER)
linear_index += 1;
}
}
}

}
}

我的索引看起来是正确的,但是当我打印出这些值时,我得到以下信息:

>> rgb_to_uint8(testmatrix)
dims: 4
X: 2
Y: 2
RGB: 3
FRAMENUMBER: 5
a is: 755965440
Linear Index: 0
Value[0]: 755965440
Linear Index: 1
Value[1]: 840180485
Linear Index: 2
Value[2]: 924395530
Linear Index: 3
Value[3]: 772808449
...etc

我显然访问了错误的地方;有人能指出我正确的方向吗?我会边做边编辑它,看看我是否能弄明白。

[编辑] 我根据以下建议更新了代码 - 我更改为 uint8_T,它确实产生了奇迹,但我希望此设置将内存中的数组读取为 0,1,2,3... 等。它似乎是“跳过”,这意味着当我试图访问它们时数组没有存储在内存中 - 我认为 Matlab 是列主要的,所以我按第 4 维索引,然后是第三维,然后是第二维, 然后第一个...

我正在创建另一个测试矩阵,但我会以另一种方式对其进行索引,并查看我是否获得了线性读出的值。感谢所有注释和指向 uint8_T 的指针(这使它开始点击得更好,并且缺少 void* 转换)。

最佳答案

根据我的评论更新:当您执行 testmatrix(:) 时,它会以线性顺序读出任意维度数组的所有元素。它向下然后穿过,然后是剩余的维度。您正在使用 testmatrix(1,1,1,1),testmatrix(1,1,1,2),testmatrix(1,1,1,3) 遍历最后一个维度。


有几个问题需要解决,但正如jucestain所说,问题的核心是数据类型。当您使用 mxGetData 时,您会得到一个 void*,您有责任确保无论您强制转换为实际的底层数据类型(在 MATLAB 数组中)。

一些注意事项:

  • 习惯使用mxIsClass检查输入类型,你不会那么容易遇到这些问题。它需要一个字符串类型作为类,当你键入 help class 时列出的类型之一,就像你调用isa in MATLAB .仅对检查进行编码是您仔细检查函数预期用途的好方法。
  • 您不需要从prhs[]mxDuplicate 来获取数据。只读取数据,但不要写入数据。
  • 仅使用 mxGetPr 来获取 double*(并且仅当 mxIsClass 表示它是 double 时!) .如果您有任何其他数据类型,请使用 mxGetData
  • mxGetData 返回一个 void*,您需要显式转换(例如 (uint32_t*))来访问数据,但同样,它不会转换基础数据,因此请确保它已经正确。
  • mxGetDimensions 返回一个 const mwSize*,因此请记住 const

关于c - Matlab MEX 文件 - 索引正确,UINT32 值不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31644227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com