如何解决转换数学函数以允许多个值
我正在尝试更改Octave / Matlab函数以允许多个值。
示例:函数 rtfib(8)产生 21 ,这是第8个斐波那契数。
我正在尝试让输入也允许 rtfib(1:8),答案将以数组 [1,1,2,3,5, 8,13,21]
我的代码如下:
function [f] = rtfib(n)
if n<0
multi=-1; %if neg number store neg in multi variable
n=abs(n); %if neg make pos
else
multi=1;
end
if (n == 0)
f = 0;
elseif (n==1)
f=1;
elseif (n == 2)
f = 1; % its 1
else
fOld = 1; % 1 again.
fOlder = 1;
for i = 3 : n
f = fOld + fOlder;
fOlder = fOld;
fOld = f;
end
end
f=f*multi; %put sign back
end
PS:我正在使用与Matlab相似的Octave 4.2.2
解决方法
此函数也可用于标量,顺序向量,非顺序向量和矩阵。此外,输出具有与输入相同的尺寸:
function res = rtfib(n)
abs_mat = abs(n);
max_num = max(max(abs_mat));
fib_vec = ones(1,max_num);
for i = 3:max_num
fib_vec(i) = fib_vec(i - 1) + fib_vec(i - 2);
end
res = zeros(size(n));
res(n ~= 0) = fib_vec(abs_mat(n ~= 0));
res(n < 0) = -res(n < 0);
end
示例:
代码:
n = 9
rtfib(n)
输出:
n = 9
ans = 34
代码:
n = 1:8
rtfib(n)
输出:
n =
1 2 3 4 5 6 7 8
ans =
1 1 2 3 5 8 13 21
代码:
n = [1:8]'
rtfib(n)
输出:
n =
1
2
3
4
5
6
7
8
ans =
1
1
2
3
5
8
13
21
代码:
n = [-5 1 6 0; 4 4 -2 8; 7 -3 0 -1]
rtfib(n)
输出:
n =
-5 1 6 0
4 4 -2 8
7 -3 0 -1
ans =
-5 1 8 0
3 3 -1 21
13 -2 0 -1
,
更快速的方法-使用1个单次循环
function a = rtfib(n)
if numel(n) == 1
len = n;
else
len = numel(n);
end
result = zeros(1,numel(n));
result(1) = 1;
result(2) = 1;
for j=3:len
result(j) = bsxfun(@plus,result(j-1),result(j-2));
end
if numel(n) == 1
a = result(len);
else
a = result;
end
end
对于rtfib(8)
:
ans =
21
对于rtfib(1:8)
ans =
1 1 2 3 5 8 13 21
不更改逻辑方法
无论输入是单个整数还是数组,我们都应将结果作为向量返回。因此,我修改了函数return a
而不是f
。
function a = rtfib(n)
a = [];
然后,我们需要使用numel
检查输入是整数还是数组。由于numel
为单个整数返回1,并为该数组返回array-size。
对于n
中的每个整数,计算斐波那契值。
for j=1:numel(n)
% Without changing the logic.
a = [a,f*multi]; %put sign back
end
代码:
function a = rtfib(n)
a = [];
for j=1:numel(n)
if n(j)<0
multi=-1; %if neg number store neg in multi variable
n(j)=abs(n(j)); %if neg make pos
else
multi=1;
end
if (n(j) == 0)
f = 0;
elseif (n(j)==1)
f=1;
elseif (n(j) == 2)
f = 1; % its 1
else
fOld = 1; % 1 again.
fOlder = 1;
for i = 3 : n(j)
f = fOld + fOlder;
fOlder = fOld;
fOld = f;
end
end
a=[a,f*multi]; %put sign back
end
end
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。