【发布时间】:2015-07-22 16:36:05
【问题描述】:
我的问题是在 Matlab 中快速执行许多低维投影。我有一个数组z,其尺寸为(n,L,d);这些参数如下获得。我取一个大小为 N 的输入数组,例如 N = [200, 200]、n = prod(N) = 200*200 = 40,000 和 d = numel(N) = 2;也就是说,n 是我的离散化网格中的点数,d 是输入数组的维度(例如,图像或高度图中的平面)。然后我用 L 点离散可能的高度(我的程序将输出 - 注意上面提到的高度图),比如L = 32。
对于每个i = 1:n 和j = 1:L,我想将矢量z(i,j,:) 投影到单位球上。* 目前,我有以下天真的代码:
z = reshape(z,[n,L,d]); z_norms = norms(z,2,3);
for i = 1:n
for j = 1:L
z(i,j,:) = z(i,j,:)/max(1,z_norms(i,j));
end
end
函数norms(v,p,dim) 沿维度dim 取矩阵v 的p 范数(在本例中输出(n,L) 矩阵)。
对于如何改进这一点,我有各种想法。一个想法如下:
for i = 1:n
for j = 1:L
normsquared = sum(z(i,j,:).^2)
if normsquared > 1
z(i,j,:) = z(i,j,:)/sqrt(normsquared)
end
end
end
请注意,normsquared 每次都会被覆盖,因此它不会占用我的空间。当我在另一个问题上使用它时,它加快了进程。然而,我刚刚在这个问题上进行了测试,它实际上更糟——大约慢了三倍;事实上,计算normsquared 所需的时间大约是第一种情况下进行投影的两倍半!
奇怪的是,如果我将 sum(z(i,j,:).^2) 更改为 z(i,j,1)^2 + z(i,j,2)^2(在使用 d = 2 的情况下),那么它实际上比第一种(幼稚)方法要快一些......如果有人也可以向我解释这一点,那么那太好了!
如果有人对如何加快速度有任何建议,我将不胜感激!目前我的程序大约 90% 的运行时间都花在了这上面!
*实际上,我想将它投影到 lambda 乘以单位球上,其中 lambda 是另一个参数,但这不太可能对算法产生影响 - 只需将 z 除以 lambda,进行投影,然后乘以 lambda, 例如。
【问题讨论】:
标签: algorithm matlab time-complexity projection