【发布时间】:2016-12-30 07:57:42
【问题描述】:
我有一个矩阵 X,它在 d 维空间中有 n 列数据向量。 给定一个向量 xj,v[j] 是它的 l1 范数(所有 abs(xji) 的总和),w[j] 是其 l2 范数(所有 xji^2 的总和)的平方,pj[ i] 是条目除以 l1 和 l2 范数的组合。最后,我需要输出:pj, v, w 用于子序列应用程序。
// 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) Flops/Time-complexity,任何人都可以通过使用 Building-functoin 或 C++ 中的新实现来帮助我加快它的速度吗?减少 O(nd) 中的常数值对我也很有帮助。
【问题讨论】:
-
不是内存分配的瓶颈吗?你不能将预先分配的数组传递给函数吗?
-
您可以尝试在第二个循环之外计算
a = alpha/v[j]和b = (1-alpha)/w[j],然后改为计算pj[i] = a*x_abs[i] + b*x_2[i];。但是,编译器可能已经为您进行了优化,并且由于浮点错误,结果可能会略有不同 -
@Bathsheba 我对内存使用没有任何限制。请继续。谢谢。
-
你可以为
x_abs[i] = abs(X[i + jd]);创建第三个for循环。然后编译器将使用矢量化来加速第二个循环(包含x_2[i] = ...等的循环)。 -
@MBo 内部的
for (unsigned long i=0; i<d; ++i) { x_abs[i] = abs(X[i+jd]); ... etc应该已经告诉您存储是“主要向量”(向量的所有分量都存储在连续的位置)
标签: c++ algorithm vector time-complexity