在 MATLAB / Octave 中为 n > 100 创建更快的斐波那契函数

2023-11-25

我有一个函数可以告诉我斐波那契数列中的第 n 个数字。问题是,当试图在斐波那契数列中找到更大的数字时,它变得非常慢,有人知道我该如何解决这个问题吗?

function f = rtfib(n)
 if (n==1)
     f= 1;
 elseif (n == 2)
     f = 2;
 else
     f =rtfib(n-1) + rtfib(n-2);   
 end

结果,

tic; rtfib(20), toc
ans =  10946
Elapsed time is 0.134947 seconds.

tic; rtfib(30), toc
ans =  1346269
Elapsed time is 16.6724 seconds.

5分钟后我什至无法得到一个值rtfib(100)

PS:我使用的是八度3.8.1


If time很重要(不是编程技术):

function f = fib(n)
if (n == 1)
   f = 1;
elseif (n == 2)
   f = 2;
else
   fOld = 2;
   fOlder = 1;
   for i = 3 : n
     f = fOld + fOlder;
     fOlder = fOld;
     fOld = f;
   end
end
end

tic;fib(40);toc; ans = 165580141; Elapsed time is 0.000086 seconds.

你甚至可以使用uint64. n = 92是你能从中得到的最多的uint64:

tic;fib(92);toc; ans = 12200160415121876738; Elapsed time is 0.001409 seconds.

Because,

fib(93) = 19740274219868223167 > intmax('uint64') = 18446744073709551615

Edit

为了得到fib(n) up to n = 183, 可以使用两个 uint64 作为一个数字,

具有特殊的求和功能,

function [] = fib(n)
fL = uint64(0);
fH = uint64(0);
MaxNum = uint64(1e19);
if (n == 1)
   fL = 1;
elseif (n == 2)
   fL = 2;
else   
   fOldH = uint64(0);
   fOlderH = uint64(0);
   fOldL = uint64(2);
   fOlderL = uint64(1);
   for i = 3 : n
      [fL q] = LongSum (fOldL , fOlderL , MaxNum);
      fH = fOldH + fOlderH + q;
      fOlderL = fOldL;
      fOlderH = fOldH;
      fOldL = fL;
      fOldH = fH;
   end
 end
 sprintf('%u',fH,fL)
 end

LongSum is:

function [s q] = LongSum (a, b, MaxNum)
if a + b >= MaxNum
   q = 1;
   if a >= MaxNum
      s = a - MaxNum;
      s = s + b;
   elseif b >= MaxNum
      s = b - MaxNum;
      s = s + a;
   else
      s = MaxNum - a;
      s = b - s;
   end
else
   q = 0;
   s = a + b;
end

Note一些并发症LongSum可能看起来没有必要,但事实并非如此!

(所有的事情都与内心有关if是我想避免的s = a + b - MaxNum在一个命令中,因为它可能会溢出并在其中存储不相关的数字s)

Results

tic;fib(159);toc; Elapsed time is 0.009631 seconds.

ans = 1226132595394188293000174702095995

tic;fib(183);toc; 已用时间为 0.009735 秒。

纤维 (183) = 127127879743834334146972278486287885163

不过,你必须要小心sprintf.

我还用三个 uint64 做到了这一点,我可以达到,

tic;fib(274);toc; 经过的时间为 0.032249 秒。

答=1324695516964754142521850507284930515811378128425638237225

(这几乎是相同的代码,但如果您有兴趣,我可以分享它)。

Note我们有fib(1) = 1 , fib(2) = 2根据问题,虽然更常见的是fib(1) = 1 , fib(2) = 1, 列出前 300 个小纤维here(感谢@Rick T)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 MATLAB / Octave 中为 n > 100 创建更快的斐波那契函数 的相关文章

  • 如何找到平面和 3d 矩阵之间的交平面

    如果我有一堆图像并且尺寸如下 size M 256 256 124 我有 3 个点 它们的坐标是 coor a 100 100 124 coor b 256 156 0 coor c 156 256 0 如何创建 M 与这 3 个点定义的平
  • 如何在放置颜色条后保持子图大小不变

    假设我们有一个 1 2 子图 我们在其中绘制了一些图形 如下所示 subplot 1 2 1 surf peaks 20 subplot 1 2 2 surf peaks 20 然后我们要添加一个颜色条 colorbar 我不希望结果中的正
  • Octave 3 与 4 脚本兼容性;可执行 Octave 程序的真实文档在哪里

    第 1 部分 在 Octave 3 4 3 在 centos 6 6 上 中 以下脚本文件 joe m 但对于 3 xminus no gui bin bash for bash exec octave q no gui no init f
  • MATLAB - 冲浪图数据结构

    我用两种不同的方法进行了计算 对于这些计算 我改变了 2 个参数 x 和 y 最后 我计算了每种变体的两种方法之间的 误差 现在我想根据结果创建 3D 曲面图 x gt on x axis y gt on y axis Error gt o
  • ROC曲线和libsvm

    给定一条 ROC 曲线plotroc m see here http www csie ntu edu tw cjlin libsvmtools roc curve for binary svm 理论问题 如何选择要使用的最佳阈值 编程问题
  • 矩形函数的数值傅里叶变换

    本文的目的是通过一个众所周知的分析傅里叶变换示例来正确理解 Python 或 Matlab 上的数值傅里叶变换 为此 我选择矩形函数 这里报告了它的解析表达式及其傅立叶变换https en wikipedia org wiki Rectan
  • 将 Matlab 的 datenum 格式转换为 Python

    我刚刚开始从 Matlab 迁移到 Python 2 7 在读取 mat 文件时遇到一些问题 时间信息以 Matlab 的日期数字格式存储 对于那些不熟悉它的人 日期序列号将日历日期表示为自固定基准日期以来已经过去的天数 在 MATLAB
  • 如何使用SIFT算法计算两幅图像的相似度?

    我已经用过SIFT http en wikipedia org wiki Scale invariant feature transform实施安德里亚 维达尔迪 http www vlfeat org overview sift html
  • 加到 100 的随机数:Matlab

    我将人口数量分成不同的矩阵 现在想使用随机数测试我的代码 快速提问 谢谢你们提前的帮助 如果我使用 100 rand 9 1 使这 9 个数字相加等于 100 的最佳方法是什么 我想要 9 个 0 到 100 之间的随机数 加起来为 100
  • typeinfo、共享库和 dlopen()(不带 RTLD_GLOBAL)

    当使用加载时 我在跨共享库时遇到了一些异常无法正常运行的问题 或者至少 正如我所希望的 我知道这存在问题 dlopen 我在这里包含一些简化的示例代码 实际情况是myapp Matlab myext1 mexglx matlab 扩展 my
  • 使用 MATLAB 正则表达式将重叠模式与捕获进行匹配

    我正在尝试解析如下所示的日志文件 09 May 2009 04 10 29 Starting foo this is stuff to ignore 09 May 2009 04 10 50 Starting bar more stuff
  • 使用嵌套 if 子句向量化循环

    Problem 我正在尝试优化代码的运行时 并且之前曾提出过类似的问题 其中包括几个嵌套的 if 语句 向量化嵌套 if 语句 https stackoverflow com questions 38125770 vectorizing n
  • 有没有一种简单的方法来提供基于 Matlab 的 Web 应用程序或 Web 服务?

    我和一位同事花了几年时间开发一个非常酷的 Matlab 应用程序 MDLcompress 在 Matlab 中 我可以输入 MDLcompress filename txt 它会告诉我有关 filename txt 内容的各种非常酷的内容
  • 性能:Matlab 与 Python

    我最近从Matlab to Python 在转换我的一个冗长代码时 我惊讶地发现Python非常慢 我分析并追踪了一个函数占用时间的问题 该函数是从我的代码中的各个位置调用的 作为递归调用的其他函数的一部分 探查器建议300两个地方都调用了
  • Python:变量的用法及其差异(“a,b = 0, 1”VS“a = 0”,“b = 1”)[重复]

    这个问题在这里已经有答案了 我正在查看 Python 手册 发现了斐波那契数生成器的这段代码 def fib n write Fibonacci series up to n a b 0 1 while b lt n print b end
  • 在Matlab中,是否可以终止脚本,但将其所有内部变量保存到工作区?

    我正在运行一个脚本 但它花费的时间太长 所以我想终止该脚本 然而 它计算了很多数据 我理想情况下不想扔掉这些数据 有没有替代方案ctrl C用什么将内部函数变量保存到工作区 理想情况下我正在寻找一个Matlab键盘快捷键如ctrl C 但如
  • 确定时间序列数据的 SOM(自组织映射)中的集群成员资格

    我也在做一个需要对时间序列数据进行聚类的项目 我正在使用在 MATLAB 中运行的 SOM 工具箱进行聚类 但遇到了以下问题 我们如何确定哪些数据属于哪个集群 SOM从数据集中随机选择数据样本 并为每个数据样本找到BMU 据我所知 SOM算
  • 此代码中 Matlab 与 C++ 速度比较

    我编写了简单的 C 代码并在 C 中对其进行了测试 然后我通过以下方式为 MATLAB 调整了相同的代码mex file name cpp并在 MATLAB 中运行相同的代码 该代码使用与 C 相同的编译器 这是代码 int k for i
  • MATLAB - 避免循环基于其他向量的元素创建矩阵

    假设我有向量x y z 长度n m l 我想创建一个细胞矩阵Q使用这些向量的元素 天真的人们可以像这样使用 for 循环 for i 1 n for j 1 m for k 1 l Q i j k someFunction x i y j
  • 如何在 Matlab 中绘制连通性/邻接矩阵图?

    我想在 MATLAB 中绘制网络 电网 的结构图 我有一个包含每个分支的往返节点的列表 我没有节点的坐标 并且每次模拟的系统拓扑都会发生变化 我还需要能够为各种线路 节点分配不同的颜色 以可视化电压问题或过载等 类似于我使用传记 下面的代码

随机推荐

  • 使用 jfeinstein10 库的滑动菜单

    我创建了一个示例应用程序来测试滑动菜单的工作原理 下面的屏幕截图显示的是我现在得到的 但是 当我单击类别按钮 如下图所示 时 我应该会看到一个二级菜单 如下面 zomato 应用程序的屏幕截图所示 我怎样才能做到这一点 我是否以正确的方式进
  • pandas read_csv 删除空白行

    我正在读取 CSV 文件作为DataFrame同时定义每列的数据类型 如果 CSV 文件中有空行 此代码会出错 如何读取没有空白行的 CSV dtype material id object location id object time
  • Python标准库真的标准吗?

    Python 标准库是标准吗 如果安装了 Python 那么标准库也会安装吗 The 文档 reads 对于类 Unix 操作系统 Python 通常作为包的集合提供 因此可能需要使用操作系统提供的打包工具来获取部分或全部可选组件 标准库i
  • PHP 会话的安全性

    我知道这个问题已经被问了数十亿次 但我对我的编码安全性非常偏执 强迫症 我正在做一个小项目 会话数据将仅包含 user id 1 用户名我的用户名 登录 true csrf token87cc51ee94178df79cccce2aebc4
  • 在线程应用程序中准确计时一行代码,C#

    假设应用程序是多线程的 在 C 中对线程或一行代码进行计时的最准确方法是什么 亲切的问候 计时线程 到底是什么意思 要精确计算 以实际时间 某件事需要多长时间 请使用 System Diagnostics Stopwatch 我不相信有任何
  • PHP 中的动态常量名称

    我正在尝试动态创建一个常量名称 然后获取该值 define CONSTANT 1 Some value try to use it dynamically constant number 1 constant name CONSTANT c
  • 在 ASP.Net Boilerplate 中,从应用程序服务层调用 SignalR Hub 是一种不好的做法吗?

    我将 Asp Net 样板模板与 ASP Net Core 2 1 一起使用 我在 Web Core 程序集中实现了一个集线器并创建了一个控制器 我可以从任何客户端使用我的集线器订阅 通知数据 这不是我的问题 我想在应用程序服务层中使用此集
  • 如何解组 JSON?

    我正在尝试将 JSON 解组为结构 但是 该结构有一个带有标签的字段 使用反射 我尝试查看标签中是否包含字符串 json 如果是这样 那么要解组的 json 应该简单地作为字符串解组到字段中 Example const data I 3 S
  • 使用 jQuery 更新 flashvars 并重新加载 flash

    我想更新 flashvars 值参数以观看另一个视频
  • 我到底如何使用 nginx 和 Gunicorn 为 Django 应用程序提供静态文件服务器?

    现在 我正在尝试遵循本教程 http honza ca 2011 05 deploying django with nginx and gunicorn 模板网站加载正确 但图像未加载 这是我的应用程序的 config py 文件的一部分
  • Android - 激活系统键锁(又名锁屏)

    我必须激活android的系统键锁 当你按下关闭电源 hang up按钮 看这里 我已经浏览过文档 但我发现的一切都是电源管理器 and 键盘锁管理器 两者似乎都不是解决方案 那么 大家知道如何从 Android 应用程序中实现这一点吗 如
  • Javascript 事件处理程序存储在哪里?

    我试图弄清楚 DOM 如何跟踪事件处理程序 无论是通过使用 jQuery addEventListener 还是通过 HTML 属性 例如 onload myFunc 进行绑定 我读到 jQuery 使用 data 方式来存储 jQuery
  • 简单的 div onclick 显示 javascript

    当我点击任何链接时 相应的 div 就会出现 但是当我单击下一个链接时 新单击的潜水以及之前单击的潜水都会显示 我想隐藏之前的 div 新开发请有人帮助我 这是链接的 html 代码 a class hide href First Impr
  • 更改 VS code 中的 java.home 路径

    I just installed java 11 coz VS code was prompting me to update it to java 11 or newer version After installing java 14
  • 如何使用 TarsosDSP 获得 MFCC?

    我到处搜索 但不知道如何在 Android 上使用 TarsosDSP 提取 MFCC 特征 我知道如何从文件中获取 FFT 有什么帮助吗 查看官方github页面 MFCC 测试文件 public class MFCCTest priva
  • 人们对动态语言有何吸引力? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 Locked 这个问题及其
  • 如何为 Blazor 页面实现自定义授权过滤器

    Blazor 服务器端 NET Core 3 1 x 查看有关授权的示例 我正在尝试获取自定义授权过滤器 属性的解决方案 我只需要在授权期间检查用户身份 https learn microsoft com en us aspnet core
  • Visual Studio 2017不支持C11新功能_Generic

    谁能告诉我为什么 Visual Studio 2017 不支持 C11 新功能 Generic 我发现这是一个非常有用的功能 但无法在 Visual Studio 2017 中使用 下面是示例代码 include
  • Terraform 在应用时从远程 URL 下载本地文件并在销毁时删除文件

    在创建实际的 lambda 资源之前 我需要从 URL 下载 lambda 存档文件 并且在运行 terraform destroy 时需要删除该文件 基本上是从远程 URL 创建的本地文件资源 我目前使用的是null resource a
  • 在 MATLAB / Octave 中为 n > 100 创建更快的斐波那契函数

    我有一个函数可以告诉我斐波那契数列中的第 n 个数字 问题是 当试图在斐波那契数列中找到更大的数字时 它变得非常慢 有人知道我该如何解决这个问题吗 function f rtfib n if n 1 f 1 elseif n 2 f 2 e