对于给定的'x',我想计算上面的总和。总和将在数组指定的长度块上执行,例如block_length = [5 4 3]
。总和执行如下:在一个维度上从-5到5,在第二维度上从-4到4,在最后一个维度上从-3到3。
伪代码如下所示:
sum = 0;
for i = -5:5
for j = -4:4
for k = -3:3
vec = [i j k];
tv = vec * vec';
sum = sum + 1/(1+tv)*cos(2*pi*x*vec'));
end
end
end
问题是,当维数未知时,我希望使用某种变量嵌套循环来求和。Matlab使用combvec
,但它返回所有可能的向量组合,这是不需要的,因为我们只计算和。当有许多维数时,combvec
返回所有组合在内存方面是不可行的。
感谢任何解决方案的想法。
PS:我想在高维数下做这个,比如650,就像机器学习一样。
1条答案
按热度按时间cwtwac6a1#
基于https://www.mathworks.com/matlabcentral/answers/345551-function-with-varying-number-of-for-loops,我编写了以下代码(我还没有对大量索引进行测试!):
其中
x
和block_length
应该都是1-x-n向量。其思想是,我们使用一个索引向量,而不是使用显式嵌套循环。
当处理
block_length
可以有650个元素的建议用例时,这有多好/效率?不多!下面是一个“快速”测试,仅使用16个维度和[-1,1]范围的索引:这在我的笔记本电脑上产生了12.7秒的运行时间。