- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这是我上一个问题的下一步 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/
我有以下代码 unsigned int headerbytes = 0U; headerbytes = (unsigned int*)strtoull(packet_space->header
我有这段无法编译的代码: public struct MyStruct { private fixed uint myUints[32]; public uint[] MyUints
在 Go 中,从函数返回哪个更有效:返回 uint 还是返回 *uint? 该函数在 cpu 密集型库的内部 for 循环中调用。 最佳答案 一般来说,只要效率是个问题,您就应该运行基准测试。 让我们
int 加上 unsigned int 返回一个 unsigned int。应该这样吗? 考虑这段代码: #include #include #include class test {
我正在尝试从可通过 URL 访问的内容中初始化一个字符串: actualresponse.response = String(contentsOfURL: url, usedEncoding: NSU
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 提供事实和引用来回答它. 1年前关闭。 Improve this
我从函数 Swift 得到类型为 UnsafeMutablePointer 的结果 我可以把它转换到UInt吗? ? 最佳答案 只需使用memory 属性来访问底层数据。 let ptr: Unsaf
我深入了解了 List并发现了以下代码: public T this[int index] { get { // Following trick can red
我在 this page on bit twiddling 的帮助下编写了这个函数: uint16_t *decode(uint64_t instr) { // decode instr (thi
我正在从微 Controller 读取两个寄存器。一个具有 4 位 MSB(前 4 位有一些其他内容),另一个具有 8 位 LSB。我想将其转换为一个 12 位 uint(准确地说是 16 位)。到目
要演示的示例代码: public int FindComplement(int num) { //uint mask = ~0; //<-- error CS0031 //
$ rustc --test mapAsMapKey.rs mapAsMapKey.rs:18:43: 18:52 error: mismatched types: expected `fn@(&&@
一般问题:我有一个很大的二维点空间,里面稀疏地分布着点。把它想象成一 block 撒满黑点的白色大 Canvas 。我必须多次迭代和搜索这些点。 Canvas (点空间)可能很大,接近极限int 的值
假设我们只是调用一个普通数字,数字会启动什么。 uint256 plainNumber 我明白它是零。但是我要问的是,有没有办法检测该数字是由编译器还是用户变量设置的。例如... uint256 pl
我试图在 leetcode.com ( https://leetcode.com/problems/number-of-1-bits/ ) 上解决一个简单的问题,我遇到了一个奇怪的行为,这可能是我缺乏
uint number = 0x418 in bits : 0000010000011000 uint number1 = 0x8041 in bits: 1000000001000001 uint
我如何在 C# 中生成具有某个最大值的伪随机 uint? (不需要最低限度。)似乎有很多问题要求完全随机,但没有上限。 澄清:此上限可能大于 int.MaxValue,因此仅强制转换 Random.N
我已经用私有(private)数据成员围绕 ulong 编写了一个简单的包装器。我希望能够将包装器转换为 ulong 以检索数据。我希望强制转换为 uint 并丢失数据是非法的,因此我没有编写对 ui
哪些是“Uint”变量?就是有“Uint8”、“Uint16”等…… 但是它们是什么? 现在我有一些时间使用 C++,但我从来不需要使用这些变量并引起我的好奇。 提前致谢。 最佳答案 uint 不是标
我有一个 native 方法,它需要一个指针来写出一个双字(uint)。 现在我需要从 (Int) 指针中获取实际的 uint 值,但是 Marshal 类只有方便的方法来读取(有符号)整数。 如何从
我是一名优秀的程序员,十分优秀!