Excel 生成一系列相乘的数字,但从1开始

Excel 生成一系列相乘的数字,但从1开始,excel,Excel,我试图生成一个一般形式的整数数组 n*0 n*1 n*2 n*3 但第一个数字必须是一(1),而不是零 这个公式适用于: =IF((ROW(INDIRECT("1:10"))-1)*n=0,1,(ROW(INDIRECT("1:10"))-1)*n) 但是我希望有一种更有效的方法,使用工作表函数。在A1,比如说99中放置一个值。在另一个单元格中输入: =IF(ROWS($1:1)=1,1,(ROWS($1:1)-1)*$A$1) 然后抄下来。例如: 使用MAX可以避免使用IF功能: 如果

我试图生成一个一般形式的整数数组

n*0
n*1
n*2
n*3
但第一个数字必须是一(1),而不是零

这个公式适用于:

=IF((ROW(INDIRECT("1:10"))-1)*n=0,1,(ROW(INDIRECT("1:10"))-1)*n)

但是我希望有一种更有效的方法,使用工作表函数。

A1,比如说99中放置一个值。在另一个单元格中输入:

=IF(ROWS($1:1)=1,1,(ROWS($1:1)-1)*$A$1)
然后抄下来。例如:


使用
MAX
可以避免使用
IF
功能:

如果希望能够在任何单元格中启动,请使用以下公式:

=MAX(1,(ROWS($1:1)-1)*$A$1)
还可以在数组公式中避免使用
IF
函数,利用TRUE等于1的事实:

=(ROW(INDIRECT("1:10"))-1)*99+(ROW(INDIRECT("1:10"))-1=0)

我已经测试了这两种方法,将它们输入单元格A1:A1048576(作为数组公式)。我的方法运行速度比你的快一倍多一点。

似乎没有比生成从零开始的序列,然后测试零,替换一更有效的算法了

但是,如果不需要指定上界,可以更高效地生成序列,我相信通过使用Harlan Grove几年前第一次看到的技术,可以以非易失性的方式生成

定义名称:

seq  Refers to: =ROW(INDEX(Sheet1!$1:$65536,1,1):INDEX(Sheet1!$1:$65536,10,1))
其中10表示序列中的数字,任何值都可以替换

我的公式会变成,n=99

=IF((seq-1)*99=0,1,(seq-1)*99)
这将生成阵列:

{1;99;198;297;396;495;594;693;792;891}
谢谢大家

编辑 进行一些计时测试表明,当生成10^6个数字的数组时,seq方法比row(间接…方法运行速度快3倍。

我会使用:
=ABS(seq-0.5)+0.5

其中
Seq={0,1,…,m}*n

如果要为
Seq
创建大型固定数组,可以从立即窗口输入:

Names.Add "Seq",[(row(1:100)-1)*99]

另请参见。

n是间隔?你所说的
更有效的方法是什么意思?
?函数更少,公式更短。如果n=99,那么系列1,99198297,…那么你不需要
间接的
=If((行($A$1:$A$10)-1)*n=0,1,(行($A$1:$A$10)-1)*n)
应该可以正常工作。但是我会检查是否还有其他问题。我希望有一个不同的算法。我希望能够控制上限。它不会总是10X,这取决于数组的大小依赖于哪里?或者哪个或什么控制上限。如果大小改变,那么这就解释了使用
间接
您可以将来自另一个单元格或源的数字连接起来,从而决定数组的大小。这可能适用于在单元格范围内生成序列,但不能像我的示例那样作为公式中的数组生成。这可能适用于在单元格范围内生成序列,但不能像我的示例那样作为公式中的数组生成时间?我通过以下方式对一些示例进行计时:将工作表计算设置为手动。清除工作表。将公式输入A1,使其生成10^6个数字。使用HiRes计时器对过程进行计时。我发现您的计时方法与我最初的努力没有什么不同。我在回答中使用seq方法执行了相同的计时方法,并发现该方法可以执行符号比我们的行快3倍(间接算法;但是“IF”方法和“TRUE”方法之间没有真正的区别嗯,我假设您在每个单元格中作为单独的数组公式输入它(而不是作为数组公式输入整个范围)?如果我在Excel 2010中执行此操作,然后按Ctrl+Alt+F9重新计算,我的计算速度大约是您原始公式的两倍。无论如何,我很高兴您找到了更好的解决方案。我采用了两种方法--数组和普通。数组运行较慢,但方法之间的关系保持不变。由于波动性问题。感谢您的贡献和chandoo网站的链接。我测试了您的版本的速度,并使用=IF((seq-1)与我的版本进行了比较…当生成10^6个数字的数组时,我发现我的版本速度稍微快一点。但我不认为差异有多大。你的第二个例子很有趣。我可能犯了一个错误,但我试图通过数组输入并填充
=SUM(如果(99*(Seq-1)=0,1,99*(Seq-1))
vs
=SUM(ABS(99)),来复制你的发现*(序号1)-0.5)+0.5)
我发现后者更快。这是针对
seq
的索引或间接定义。在固定范围内,使用
IF
版本可能会更快-您基于哪个定义得出结果?我的测试方式完全不同。清除工作表。将计算设置为手动。输入其中一个=ABS((seq-1)*99-0.5)+0.5或=IF((seq-1)*99=0,1,(seq-1)*99),seq定义为=行(索引(Sheet1!$1:$1000000,1,1):索引(Sheet1!$1:$1000000,1))。启动HiResTimer;计算工作表;停止HiResTimer;记录运行时间。在我的机器上,20次重复的平均时间约为0.00021秒。