调用函数后test,我打印dtr1数组。我期待获得100所有元素,但我没有得到它。这是为什么?
#include "ImageUtil2D.h"
#define W 10
#define H 10
#define MAX 100000
#define No_THREADS 10
surface<void,2> surfD;
__global__ void test()
{
for(int i=0;i<W;i++)
for(int j=0;j<H;j++)
{
float a=100;
surf2Dwrite(a, surfD, i,j, cudaBoundaryModeTrap);
}
}
int main()
{
int *image = new int[W*H];
float *dtr = new float[W*H];
ImageUtil2D::InitImg(image, dtr, W, H);
const size_t sizef = size_t(W*H)*sizeof(float);
cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc(32, 0, 0, 0, cudaChannelFormatKindFloat);
cudaArray* cuArrD;
cudaMallocArray(&cuArrD, &channelDesc, W*H, 0, cudaArraySurfaceLoadStore);
//cudaMemcpyToArray(cuArrD, 0, 0, …Run Code Online (Sandbox Code Playgroud) 我的代码有什么问题?它不编译..
class FileNames
{
public:
static char* dir;
static char name[100];
static void Init3D()
{
FileNames::dir = "C://3D//";
FileNames::name = "abc";
}
};
Run Code Online (Sandbox Code Playgroud) 我的图像大小为512 x 512 x 512.我需要单独处理所有体素.如何获取线程ID来执行此操作?如果我使用1D线程ID,则块数将超过65536.
int id = blockIdx.x*blockDim.x + threadIdx.x;
Run Code Online (Sandbox Code Playgroud)
注意: - 我的卡不支持3D网格
如何为交叉验证生成ROC曲线?
对于单个测试,我认为我应该对SVM的分类分数进行阈值以生成ROC曲线.
但我不清楚如何生成交叉验证?
pattern-recognition machine-learning image-processing computer-vision
我有一个灰色图像.我可以使用以下方法在matlab中创建热图:
I = imagesc(I);
Run Code Online (Sandbox Code Playgroud)
它以颜色显示强度值.我想用这个热图获得彩色图像.我该怎么做?
这是imagesc的输出:
我需要s x s x 3 从图像(3个通道)中提取大约指定2D位置的图像块.
如何在没有for循环的情况下有效地完成此操作?我知道我可以在(x,y)位置周围提取一个补丁:
apatch = I(y-s/2:y+s/2, x-s/2:x+s/2, :)
Run Code Online (Sandbox Code Playgroud)
我如何为许多补丁做到这一点?我知道我可以使用MATLAB的功能,blockproc但我无法指定位置.
根据http://en.wikipedia.org/wiki/CUDA,块的最大x或y维度1024块的最大z维度64
这是否意味着每个块可以有1024 x 1024 x 64个线程,或者块中最多可以有1024 + 64个线程?
我有一组图像.我想学习一个类SVM(OC-SVM)来模拟特定类(正面)的分布,因为我没有足够的例子来表示其他类(负面).我对OC-SVM的理解是,它试图将数据与原点分开,换句话说,它试图学习超球以适应一类数据.
我的问题是,
如果我想使用OC-SVM的输出作为概率估计,我该怎么办?
OC-SVM和任何聚类算法(例如k-means)之间有什么区别?
我需要从大小为NxN(N >> 10)的图像中获取10x10滑动窗口大小的局部像素直方图.
我正在使用以下代码来获取滑动窗口.
B = im2col(inputImage, [10, 10],'sliding');
Run Code Online (Sandbox Code Playgroud)
但根据这段代码,我无法确定两个本地窗口之间的重叠.如何从图像中获取局部直方图,其滑动窗口大小为mxm,两个滑动窗口之间有一半重叠?
在cuda中我们可以创建扩展名为.cuh的头文件,我们可以从任何地方调用这些函数,比如
__device__ void doSomething()
{
....................
}
void doSomthingOnHost()
{
....................
}
Run Code Online (Sandbox Code Playgroud)
这两个功能都是公开的.如何将主机功能设为私有?
如何在不定义函数大小的情况下传递二维或多维数组作为函数的参数?
这是我的示例代码:
void test(int *a) {
a[0][0] = 100;
}
int main() {
int a[2][2];
test(a);
cout<<a[0][0];
}
Run Code Online (Sandbox Code Playgroud) 我正在定义一个大小为9的数组.但是当我访问数组索引10时,它没有给出任何错误.
int main() {
bool* isSeedPos = new bool[9];
isSeedPos[10] = true;
}
Run Code Online (Sandbox Code Playgroud)
我期望得到编译器错误,因为isSeedPos[10]我的数组中没有数组元素.
为什么我没有收到错误?
这是我的代码
__device__ void calculateDT(float *devD, int *devImg, int cntVoxelLi, int *neighVoxels)
{
float minV = devD[cntVoxelLi];
int cv = devImg[cntVoxelLi];
float v = 0,cuVal = 0;
int c1=0,d1=0,r1=0;
GetInd2Sub(cntVoxelLi, r1,c1,d1);
for(int ind=0;ind<9;ind++)
{
v = pow(float(cv - devImg[neighVoxels[ind]]),2);
cuVal = devD[neighVoxels[ind]] + (1-exp(-v/100));
minV = min(minV, cuVal);
}
devD[cntVoxelLi] = minV;
}
Run Code Online (Sandbox Code Playgroud)
当我运行整个程序时,大约需要 15 秒。但是当我删除
exp(-v/100)
Run Code Online (Sandbox Code Playgroud)
只需7秒。似乎是这个exp操作需要很多时间。我也尝试使用 expf 函数。如何提高性能?