在Matlab中计算[a1 a2 a3…an]的所有两个元素和

在Matlab中计算[a1 a2 a3…an]的所有两个元素和,matlab,for-loop,vector,sum,Matlab,For Loop,Vector,Sum,背景:我正在使用Matlab进行Euler项目,以练习我几乎不存在的编程技能 我的问题是: 现在我有一个向量,其中大约有6500个数字(从12到28122)作为元素,我想计算所有两个元素的和。也就是说,我只需要每个和的一个实例,所以在计算了a1+an之后,就没有必要计算a+a1 编辑以澄清:这包括a1+a1、a2+a2、…、an+an之和 问题是这太慢了 针对具体问题的限制: 假设28123或以上的总和不需要计算,因为这些总和不能用于进一步解决问题 我的做法: AbundentNumberSum

背景:我正在使用Matlab进行Euler项目,以练习我几乎不存在的编程技能

我的问题是:

现在我有一个向量,其中大约有6500个数字(从12到28122)作为元素,我想计算所有两个元素的和。也就是说,我只需要每个和的一个实例,所以在计算了a1+an之后,就没有必要计算a+a1

编辑以澄清:这包括a1+a1、a2+a2、…、an+an之和

问题是这太慢了

针对具体问题的限制:

假设28123或以上的总和不需要计算,因为这些总和不能用于进一步解决问题

我的做法:

AbundentNumberSumsRaw=[];
for i=1:3490
    AbundentNumberSumsRaw=[AbundentNumberSumRaw AbundentNumbers(i)+AbundentNumbers(i:end);
end
AbundantNumbers = 1:6500; % replace with the list you generated somewhere else
maxInteger = 28122;
AbundantNumberSum(1:maxInteger) = true; % logical array

for i = 1:length(AbundantNumbers)
  sumIndices = AbundantNumbers(i) + AbundantNumbers;
  AbundantNumberSum(sumIndices(sumIndices <= maxInteger)) = false;
end
这非常有效:p

我的评论:

我非常肯定,递增地增加向量AbundentNumbersRaw是不好的编码,因为这意味着内存使用将不必要地激增。我没有这样做,因为a)我不知道要预分配什么大小的向量,b)如果不使用一些丑陋的嵌套循环,我无法想出一种方法将总和有序地注入到AbundentNumbersRaw中

“for i=1:3490”之所以比元素数低,是因为我检查并发现索引高于3490的数字的所有结果总和都太大,我无法使用

我很确定我的主要问题是这个程序需要对向量AbundentNumbersRaw进行大量的增量增加

如有任何帮助和建议,将不胜感激:)

干杯

拉斯姆斯

假设

a = 28110*rand(6500,1)+12;
然后

这是你要做的计算

您还声明值超过28123的和应该被丢弃

这可以概括如下:

% Compute all 2-element sums without repetitions
C = arrayfun(@(x) a(x)+a(x:end), 1:numel(a), 'uniformoutput', false);
C = cat(1, C{:});

% discard sums exceeding threshold
C(C>28123) = [];
或者使用循环

% Compute all 2-element sums without repetitions
E = cell(numel(a),1);
for ii = 1:numel(a)
    E{ii} = a(ii)+a(ii:end); end
E = cat(1, E{:});

% discard sums exceeding threshold
E(E>28123) = [];

简单的测试表明
arrayfun
比循环快一些,所以我选择
arrayfun
选项

由于您的主要问题是找出给定集合中的哪些整数可以写成不同集合中两个整数的和,因此我会选择不同的方法:

AbundentNumberSumsRaw=[];
for i=1:3490
    AbundentNumberSumsRaw=[AbundentNumberSumRaw AbundentNumbers(i)+AbundentNumbers(i:end);
end
AbundantNumbers = 1:6500; % replace with the list you generated somewhere else
maxInteger = 28122;
AbundantNumberSum(1:maxInteger) = true; % logical array

for i = 1:length(AbundantNumbers)
  sumIndices = AbundantNumbers(i) + AbundantNumbers;
  AbundantNumberSum(sumIndices(sumIndices <= maxInteger)) = false;
end
AbundantNumbers=1:6500;%替换为您在其他地方生成的列表
maxInteger=28122;
AbundantNumberSum(1:maxInteger)=真;%逻辑阵列
对于i=1:长度(丰度数)
SumIndex=丰度数(i)+丰度数;

我的方法如下:

v = 1:3490;   % your vector here
s = length(v);
result = zeros(s);  % preallocate memory

for m = 1:s
     result(m,m:end) = v(m)+v(m:end);    
end

你将得到一个由3490 x 3490个元素组成的矩阵,其中一半以上为0。

你想包括
a1+a1
,即自求和吗?是的。谢谢你的问题,我会澄清原始帖子。我确实想把每个元素都添加到它本身中,但似乎没有太大的区别。谢谢你的回答,我会尝试即时消息补充一下。由于我对这方面还不太熟悉,我将不得不花一些时间学习ThothHanks的一些函数,我也会尝试理解这一点。我整天都在做这些问题,而且还没有吃东西,所以我感到非常头晕,所以我恐怕还不能做出非常有意义的反应。:)谢谢,我只是粗略地尝试了一下,这在性能上有了很大的改进。但仍然在几分钟的范围内,这可能是或不是我所问问题的最佳解决方案。如果是,我可能选择了一种不好的方法来解决Euler项目问题。