matlab 如何以编程方式计算此总和

svmlkihl  于 2022-12-13  发布在  Matlab
关注(0)|答案(1)|浏览(145)

对于给定的'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,就像机器学习一样。

cwtwac6a

cwtwac6a1#

基于https://www.mathworks.com/matlabcentral/answers/345551-function-with-varying-number-of-for-loops,我编写了以下代码(我还没有对大量索引进行测试!):

function sum = fun(x, block_length)

sum = 0;
n = numel(block_length);   % Number of loops
vec = -ones(1, n) .* block_length;   % Index vector

ready = false;
while ~ready
    
    tv = vec * vec';
    
    sum = sum + 1/(1+tv)*cos(2*pi*x*vec');
    
    % Update the index vector:
    ready = true;    % Assume that the WHILE loop is ready
    for k = 1:n
        vec(k) = vec(k) + 1;
        if vec(k) <= block_length(k)
            ready = false;
            break;    % v(k) increased successfully, leave "for k" loop
        end
        vec(k) = -1 * block_length(k);    % v(k) reached the limit, reset it
    end
end
end

其中xblock_length应该都是1-x-n向量。
其思想是,我们使用一个索引向量,而不是使用显式嵌套循环。
当处理block_length可以有650个元素的建议用例时,这有多好/效率?不多!下面是一个“快速”测试,仅使用16个维度和[-1,1]范围的索引:

N = 16; tic; in = 0.1 * ones(1, N); sum = fun(in, ones(size(in))), toc;

这在我的笔记本电脑上产生了12.7秒的运行时间。

相关问题