我正在研究多边形数字并列出哪些数字可以表示为三个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
由于
答案 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中避免循环。