1

I was working about polygonal numbers and doing a list of what numbers can be represented as a sum of three 27-gonals. I have done a Matlab code but it is really slow. Can you please help me to improve it?

    n=0:100;             % number of polygonals
    pn=(25*n.^2-23*n)/2; % vector of 27-gonal numbers
    s=1;
    % the following part generate the list of numbers represented as a sum of three 27-    gonals
    for n=1:101
        for m=1:101
            for l=1:101
                sumadetres(s)=pn(n)+pn(m)+pn(l);
                s=s+1;
            end
        end
    end   
    k=1;

    % some of the numbers are repeted, so the following part eliminated the repeated ones.
    n=length(sumadetres);

    while k<=n   
        j=1;
        while j<=n
            if k~=j
                if sumadetres(k)==sumadetres(j)
                    sumadetres(j)=[];
                    n=length(sumadetres);
                end
            end
            j=j+1;
         end
        k=k+1;
    end

    sumadetres=sort(sumadetres); % organise the numbers

Thanks

4

1 回答 1

4

您可以使用以下方法完成所有操作(我认为):

n = 0:100;
pn = (25*n.^2 - 23*n)/2;

sumadetres = unique(bsxfun(@plus, pn, pn'));
sumadetres = unique(bsxfun(@plus, sumadetres, pn));

该函数bsxfun在 MATLAB 中对于像这样的矢量化操作非常有用。您可以在此处阅读文档。基本上bsxfun为您提供了一种在两个向量之间执行元素二元运算的有效方法。

bsxfun上面使用的第一个表达式将 的每个值添加pn'到 的每个值,pn并创建一个结果矩阵。通过使用该unique函数,您只存储此矩阵中的唯一值。使用bsxfunthen 的第二个表达式将 的每个值添加pn到来自第一个表达式的唯一结果的向量中。结果应该是 的所有唯一组合的向量pn(n) + pn(m) + pn(l)

一般来说,在 MATLAB 中,使用内置向量化函数比使用循环快得多。如果您使用 C++ 等进行了大量编程,这是违反直觉的,但这是因为 MATLAB 是一种解释性语言,基本上使用内置的矢量化函数会导致在处理器上执行的实际代码更高效。虽然很奇怪,但您想避免 MATLAB 中的循环。

于 2013-07-01T02:45:21.240 回答