我有一个维度为 dim*dim 的稀疏矩阵 P 作为指针给出
double* P
/* create the output matrix */
plhs[0] = mxCreateDoubleMatrix(dim,dim,mxREAL);
/* get a pointer to the real data in the output matrix*/
P = mxGetPr(plhs[0]);
我在 mex 文件中执行此操作,因为我需要很多 for 循环来填充 P 并且 c++ 比 matlab 快得多。
目前,dim=22500,c++ 填充 P 大约需要 2 秒(使用 matlab,这个任务需要 50 秒),大约需要 100 秒来规范化 matlab 中的矩阵,再次需要 100 秒来擦除 matlab 中的所有零列。我在 matlab 中使用以下代码执行此操作:
for i=1:size(P,1)
if sum(P(i,:)) > 0
sum(P(i,:))
P(i,:)=(1/sum(P(i,:))).*P(i,:);
end
end
% clear empty rows and colunms
P(~any(P,2),:)=[];
P(:,~any(P))=[];
我现在的问题是:我也可以在 C++ 中执行此操作吗?我尝试通过以下方式在 C++ 中规范化 P:
int i;
int j;
int sum;
int get_idx(int x, int y, int rows) {
return x +y * rows;
}
/* NORMALIZE */
for(i = 0; i <dim; i++) {
sum=0;
for(j=0; j<dim;j++) {
sum = sum + P[get_idx(i,j,dim)];
}
if(sum > 0) {
for(j=0; j<dim;j++) {
P[get_idx(i,j,p_rows)]=P[get_idx(i,j,dim)]*(1/sum);
}
}
}
但由于某种原因,这段代码似乎没有改变 P,而且在 c++ 中这需要大约 85 秒。有没有更快的方法也有效?另外,是否可以清除空行和空列?