matlab-求看一下这个Matlab&c++混合编程的代码实现的是什么功能?

问题描述

求看一下这个Matlab&c++混合编程的代码实现的是什么功能?

RT,程序代码如下:

 #include <math.h>
#include<omp.h>
#include <sys/types.h>
#include "mex.h"
#define INF 1E20
typedef signed int int32_t;

/*
 * Generalized distance transforms based on Felzenswalb and Huttenlocher.
 */

static inline int square(int x) { return x*x; }

void dt1d(float *src, float *dst, int *ptr, int step, int n, double a, double b) {
  int   *v = new int[n];
  float *z = new float[n+1];
  int k = 0;
  v[0] = 0;
  z[0] = -INF;
  z[1] = +INF;
  for (int q = 1; q <= n-1; q++) {
    float s = ((src[q*step] - src[v[k]*step]) - b*(q - v[k]) + a*(square(q) - square(v[k]))) / (2*a*(q-v[k]));
    while (s <= z[k]) {
      // Update pointer
      k--;
      s  = ((src[q*step] - src[v[k]*step]) - b*(q - v[k]) + a*(square(q) - square(v[k]))) / (2*a*(q-v[k]));
    }
    k++;
    v[k]   = q;
    z[k]   = s;
    z[k+1] = +INF;
  }

   k = 0;
   for (int q = 0; q <= n-1; q++) {
     while (z[k+1] < q)
       k++;
     dst[q*step] = a*square(q-v[k]) + b*(q-v[k]) + src[v[k]*step];
     ptr[q*step] = v[k];
  }

  delete [] v;
  delete [] z;
}

// matlab entry point
// [M, Ix, Iy] = dt(vals, ax, bx, ay, by)
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
  if (nrhs != 5)
    mexErrMsgTxt("Wrong number of inputs");
  if (nlhs != 3)
    mexErrMsgTxt("Wrong number of outputs");
  if (mxGetClassID(prhs[0]) != mxSINGLE_CLASS)
    mexErrMsgTxt("Invalid input");

  const int *dims = mxGetDimensions(prhs[0]);
  float *vals = (float *)mxGetPr(prhs[0]);
  double ax = mxGetScalar(prhs[1]);
  double bx = mxGetScalar(prhs[2]);
  double ay = mxGetScalar(prhs[3]);
  double by = mxGetScalar(prhs[4]);

  mxArray *mxM = mxCreateNumericArray(2, dims, mxSINGLE_CLASS, mxREAL);
  mxArray *mxIx = mxCreateNumericArray(2, dims, mxINT32_CLASS, mxREAL);
  mxArray *mxIy = mxCreateNumericArray(2, dims, mxINT32_CLASS, mxREAL);
  float *M = (float *)mxGetPr(mxM);
  int32_t *Ix = (int32_t *)mxGetPr(mxIx);
  int32_t *Iy = (int32_t *)mxGetPr(mxIy);

  float *tmpM = (float *)mxCalloc(dims[0]*dims[1], sizeof(float));
  int32_t *tmpIx = (int32_t *)mxCalloc(dims[0]*dims[1], sizeof(int32_t));
  int32_t *tmpIy = (int32_t *)mxCalloc(dims[0]*dims[1], sizeof(int32_t));

  int coreNum = omp_get_num_procs();
  int threadNum=coreNum;
  if (threadNum > dims[1])
    threadNum = dims[1];
  if (threadNum > dims[0])
    threadNum = dims[0];
  omp_set_num_threads(threadNum);
  #pragma omp parallel for schedule (guided)
  for (int x = 0; x < dims[1]; x++)
    dt1d(vals+x*dims[0], tmpM+x*dims[0], tmpIy+x*dims[0], 1, dims[0], -ay, -by);

  #pragma omp parallel for schedule (guided)
  for (int y = 0; y < dims[0]; y++)
    dt1d(tmpM+y, M+y, tmpIx+y, dims[0], dims[1], -ax, -bx);

  // get argmins and adjust for matlab indexing from 1
  for (int x = 0; x < dims[1]; x++) {
    for (int y = 0; y < dims[0]; y++) {
      int p = x*dims[0]+y;
      Ix[p] = tmpIx[p]+1;
      Iy[p] = tmpIy[tmpIx[p]*dims[0]+y]+1;
    }
  }

  mxFree(tmpM);
  mxFree(tmpIx);
  mxFree(tmpIy);
  plhs[0] = mxM;
  plhs[1] = mxIx;
  plhs[2] = mxIy;
}

/*
%%% DEBUGGING CODE %%%
N = 500;
A = rand(N,N);
w = rand(4,1);

tic; [res,ix,iy] = dt(A,w(1),w(2),w(3),w(4)); toc;
tic; [res2,ix2,iy2] = dt2(A,w(1),w(2),w(3),w(4)); toc;

norm(res(:) - res2(:))
mean(ix(:) ~= ix2(:))
mean(iy(:) ~= iy2(:))

*/

不太清楚这里的dt1d是从哪里来的?

解决方案

这个dt1d不是程序一开始写的函数么,这个是所谓的基于Felzenswalb and Huttenlocher的广义距离变换

时间: 2024-08-07 04:20:47

matlab-求看一下这个Matlab&amp;amp;c++混合编程的代码实现的是什么功能?的相关文章

vb-急求零件管理系统,跪求看一下

问题描述 急求零件管理系统,跪求看一下 零件交易中心管理系统主要提供顾客和供应商之间完成零件交易的功能,其中包括: 供应商信息.顾客信息以及零件信息. 供应商信息包括供应商号.供应商名.地址.电话.简介: 顾客信息包括顾客号,顾客名.地址.电话: 零件信息包括零件号.零件名.重量.颜色.简介等. 此系统可以让供应商增加.删除和修改所提供的零件产品, 还可以让顾客增加.删除和修改所需求的零件. 交易员可以利用顾客提出的需求信息和供应商提出的供应信息来提出交易的建议,由供应商和顾客进行确认后即完成这

如何用matlab求二项分布的期望值

问题描述 如何用matlab求二项分布的期望值 如何用matlab求二项分布的期望值?如下面这个二项分布,怎么用MATLAB去求?谢谢!! 解决方案 看:http://www.baidu.com/baidu?wd=matlab%C7%F3%B6%FE%CF%EE%B7%D6%B2%BC%B5%C4%C6%DA%CD%FB%D6%B5&tn=monline_4_dg.百度还是要会的吧... 解决方案二: 按照你的式子,二项式分布的期望值为N/F,可以参见函数random()的帮助.二项式分布有两个

c#与BP神经网络MATLAB程序混合编程的问题。求大神指点

问题描述 正在做一个项目,需要用到c#与BP神经网络MATLAB程序混合编程.我看网上有好多种方法做.有的用deploytool做成动态链接库的,还有的用COM组件做的,还有的用什么交叉混合编程.求大神指点到底用什么方法做呢??我现在只会用deploytool做成动态链接库,连接比较简单的m文件呢. 解决方案 解决方案二:用matlib将m文件编译成C#可用的dll.编译的时候选择编译类型为.net动态库解决方案三:编译的时候总会出现newoff出错,也就是说不能调用BP神经网络的工具箱,不知道

指纹特征提取 matlab 求程序 以及注释 方案思想

问题描述 指纹特征提取 matlab 求程序 以及注释 方案思想 团队程序总是不能pass 累觉不爱 求助各位思密达 怎么悬赏还不能 给支付宝或者快递送礼物行不 累觉不爱啊

求大神解决matlab的程序问题

问题描述 求大神解决matlab的程序问题 为什么总是出现 undefined command/function'qiege' 解决方案 我知道这是没定义,可是怎样才能定义呢--实在不会-求好心人帮帮忙啦

模拟退火算法优化BP神经网络函数拟合源程序,急求,毕设用 matlab

问题描述 模拟退火算法优化BP神经网络函数拟合源程序,急求,毕设用 matlab 想用模拟退火优化BP神经网络,但误差增大,急求解决. 主函数:需调用函数fx2.evaluate和errorBP clc clear %随机产生200组输入数据x.输出数据y input=10*rand(2,200)-5; output=zeros(1,200); for i=1:200 output(i)=fx2(input(:,i)); end %设置网络节点数 inputnum=2; hiddennum=5;

求大神求解-matlab图像局部增强程序求解

问题描述 matlab图像局部增强程序求解 求对某个文件夹中的10张图片进行局部增强,要求只增强某一小区域而保持其他部分不变的matlab程序?新手刚学matlab,求大神指教 解决方案 Matlab 求解数独的程序matlab图像缩放程序

分布图-求问怎么用matlab画heatmap

问题描述 求问怎么用matlab画heatmap 大概就像这样的图.我有许多二维的坐标点,想用matlab画成热度图,就是点分布越密集的地方越红,求问怎么画 解决方案 http://www.mathworks.com/matlabcentral/fileexchange/24253-customizable-heat-maps/content/html/heatmap_examples.html 解决方案二: MATLAB画箭头

求GABOR滤波的matlab代码

问题描述 求GABOR滤波的matlab代码 数字图像处理gabor滤波代码不知道,还有主成分分析代码,急需急需???..////////////// 解决方案 http://blog.csdn.net/abcjennifer/article/details/7360436