我在CUDA完成了我的论文,但我遇到了最后一个问题,这与舍入浮点数有关。
我有一个名为bin的整数变量,它是x + y * X_dim的编码。鉴于bin我想找到起源它的x和y coordenates,所以我可以进行对称计算。这是我原来的计划:
float yaux,xaux;
yaux=(float)floorf((float)bin/((float)DETECTOR_X_DIM));
if(abs(yaux-floorf(yaux)) < 0.0001)
yaux=floorf(yaux);
else
yaux=ceilf(yaux);
xaux=(float)((float)(((float)bin/((float)DETECTOR_X_DIM))-(float)yaux)*((float)DETECTOR_X_DIM));
return (int)xaux;
if(abs(xaux-floorf(xaux)) < 0.0001)
xaux=floorf(xaux);
else
xaux=ceilf(xaux);
return (int)xaux;
xaux = (float)DETECTOR_X_DIM - xaux -(float)1;
return (int)xaux+(int)yaux*DETECTOR_X_DIM;
问题在于它适用于探测器的某些箱子,但它对其他箱子不起作用(它返回xaux加1)。有没有更好的方法呢?
提前谢谢
答案 0 :(得分:1)
我假设您的意思是bin = x+y*X_dim
其中x,y是您希望在给定浮点数bin
(不一定是整数)和已知整数常量X_dim
的情况下恢复的整数索引。我的基础是您的其他问题(CUDA kernel's vectors' length based on threadIdx和CUDA 3D matrix index),您的代码更具可读性。在这种情况下,您需要简化的等效Matlab's sub2idx function:
void Sub2Idx(int& x, int& y, float bin, int X_dim) {
y = (int)(bin / X_dim);
x = (int)(bin) - y*X_dim;
}
但是,我假设你想沿着x轴向下舍入bin
。双线性插值可能更合适,但对于这样一个不明确的问题,这是太多的假设。