【发布时间】:2016-03-29 06:47:03
【问题描述】:
我有一个 MATLAB 代码
%% Inputs are theta and h (size NxM)
alpha=zeros(N,M);
h_tmp=zeros(N,M);
h_tmp(1:N-1,:)=h(2:N ,:);
for i=1:N
alpha(i,:)=theta.*(h_tmp(i,:)+h(i,:));
end
通过使用向量化的方法,上面的代码可以
alpha = theta .* [h(1:N-1,:) + h(2:N,:); h(N,:)];
为了加快代码速度,我想用 C++ 在 MEX 文件中重写它。 MATLAB 和 C++ 在二维数组中的主要区别是行优先顺序 (MATLAB) 和列优先顺序 (C++)
double *h, *alpha, *h_temp;
int N,M;
double theta;
N = (int) mxGetN(prhs[0]); //cols
M = (int) mxGetM(prhs[0]); //rows
h = (double *)mxGetData(prhs[0]);
theta = (double)*mxGetPr(prhs[1]);
/* Initial zeros matrix*/
plhs[0] = mxCreateDoubleMatrix(M, N, mxREAL); alpha = mxGetPr(plhs[0]);
//////////////Compute alpha/////////
for (int rows=0; rows < M; rows++) {
//h[N*rows+cols] is h_tmp
for (int cols=0; cols < N; cols++) {
alpha[N*rows+cols]=theta*(h[N*rows+cols+1]+h[N*rows+cols]);
}
}
我的 Mex 代码和 MATLAB 代码是否等效?如果没有,你能帮我解决它吗?
【问题讨论】:
-
不是
rows+rows*N,是吗?如果我正确理解您的代码,您必须有一个列循环并将行数与列索引相乘。它应该类似于alpha[N*rows+col],其中col是第二个内部循环的计数器... -
代表h和h_tmp怎么样?这是正确的吗。我现在会更正它并再次检查
-
第二个for循环中的条件不能是
rows < N,否则你将无限循环(因为在执行过程中行和N都不会改变)。另外看看this link to the mathworks forums,我认为你在C++中尝试做的事情会更慢,因为Matlab可能已经对你的代码进行了多线程处理。 -
请注意,MATLAB 向量化工具已经在 C 中。您很可能不会在 mex 文件中使用 3 个基本数学运算来加速 for 循环。最多是一样的速度
-
@FirefoxMetzger:这是错字。我纠正了它。 Ander Biguri:因为上述方法被多次调用(~6000 次)。因此,小幅提高速度会很有用