0
我有一个矩阵X有n列数据向量在d维空间。 给定一个矢量XJ,v [j]的是其L1范数(所有ABS(XJI的总和)),W [j]的是其L2范数的平方(在所有XJI^2),和PJ [I]的总和是通过L1和L2范数划分条目的组合。最后,我需要输出:pj,v,w for subsequet应用程序。如何在C++中快速计算矢量的归一化l1和l2范数?
// X = new double [d*n]; is the input.
double alpha = 0.5;
double *pj = new double[d];
double *x_abs = new double[d];
double *x_2 = new double[d];
double *v = new double[n]();
double *w = new double[n]();
for (unsigned long j=0; j<n; ++j) {
jm = j*m;
jd = j*d;
for (unsigned long i=0; i<d; ++i) {
x_abs[i] = abs(X[i+jd]);
v[j] += x_abs[i];
x_2[i] = x_abs[i]*x_abs[i];
w[j] += x_2[i];
}
for (unsigned long i=0; i<d; ++i){
pj[i] = alpha*x_abs[i]/v[j]+(1-alpha)*x_2[i]/w[j];
}
// functionA(pj){ ... ...} for subsequent applications
}
// functionB(v, w){ ... ...} for subsequent applications
我上面的算法需要O(ND)拖/时间的复杂性,任何一个可以帮助我通过使用建筑functoin或新的实现在C++加快呢?减少O(nd)中的常数值对我也很有帮助。
是不是内存分配的瓶颈?你不能将预分配的数组传递给函数吗? – Bathsheba
你可以尝试在第二个循环外计算'a = alpha/v [j]'和'b =(1-alpha)/ w [j]'然后计算'pj [i] = a * x_abs [i] + b * x_2 [i];'而是。然而,编译器可能已经为你做了这种优化,并且由于浮点错误,结果可能会稍微有所不同 – samgak
@Bathsheba我对内存使用没有限制。请继续。谢谢。 – olivia