Matlab,多边形数字

时间:2013-07-01 01:56:16

标签: matlab

我正在研究多边形数字并列出哪些数字可以表示为三个27-gonals的总和。我做了一个Matlab代码,但它真的很慢。你能帮我改进一下吗?

    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

由于

1 个答案:

答案 0 :(得分: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中对于像这样的矢量化操作非常有用。你可以阅读the documentation here。基本上bsxfun为您提供了在两个向量之间执行逐元素二元运算的有效方法。

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

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