首页 理论教育 复数存储布局在GPU与MATLAB混合编程中的应用

复数存储布局在GPU与MATLAB混合编程中的应用

时间:2023-11-24 理论教育 版权反馈
【摘要】:例如,复数C=3+7i存储如下:接下来快速验证一下,MATLAB如何存储复数:编译这一段c-mex测试代码,并用样本数运行这段代码:(你可以用范例TestComplex_first.m进行测试。事实上,MATLAB是在分开的两个数组中存储复数的实部和虚部。因此,MATLAB提供了两个函数来访问这些数组,mxGetPr(...)提供访问实数数组的指针,mxGetPi(...)提供访问虚数数组的指针。

复数存储布局在GPU与MATLAB混合编程中的应用

我们会经常在很多地方遇到复数。尤其是在图像和信号处理中,数据可能是复数,也可能是实数,或者两者兼有。通过算法可以将实数变成复数,或者将复数变成实数。因此,当在c-mex函数中接收来自MATLAB的数据,或者传送数据给MATLAB时,要确保了解MATLAB在存储器空间中是如何打包复数的。

当在存储器中存储复数时,可以先放实数部分再放虚数部分,或者反过来。通常,先存复数的实数部分。例如,复数C=3+7i存储如下:

978-7-111-52904-0-Chapter04-16.jpg

接下来快速验证一下,MATLAB如何存储复数:

978-7-111-52904-0-Chapter04-17.jpg

978-7-111-52904-0-Chapter04-18.jpg

编译这一段c-mex测试代码,并用样本数运行这段代码:

978-7-111-52904-0-Chapter04-19.jpg

(你可以用范例TestComplex_first.m进行测试。)

样本数的实部存储在0x6F2FBB80,而虚部存储在0x6F2FC940。如你所见,它们彼此并不相邻。事实上,MATLAB是在分开的两个数组中存储复数的实部和虚部。因此,MATLAB提供了两个函数来访问这些数组,mxGetPr(...)提供访问实数数组的指针,mxGetPi(...)提供访问虚数数组的指针。对测试程序做一点修改,观察当数据是一组复数时会发生什么情况:(www.xing528.com)

978-7-111-52904-0-Chapter04-20.jpg

978-7-111-52904-0-Chapter04-21.jpg

图4.1 c-mex中的复数数组

当编译和运行样本复数数组时,可以得到如下数据:

978-7-111-52904-0-Chapter04-22.jpg

(你可以用范例TestComplex_second.m进行测试)

可以清楚地看到,存储复数的实部和虚部为两个不同的数组,如图4.1所示。

如果输入数据为二维复数,会收到两个二维数组:一个实部的二维数组和一个虚部的二维数组。需牢记,它们是按列顺序存储的。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈