转换数学函数以允许多个值
Converting a math function to allow for multiple values
我正在尝试更改 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
更快的方法 - 使用 1 个 for 循环
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将结果作为向量,无论输入是单个整数还是数组。因此我修改了函数 return a
而不是 f
.
function a = rtfib(n)
a = [];
然后,我们需要检查输入是整数还是数组,使用numel
。因为 numel
returns 1 对于单个整数和 returns 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
此函数也适用于标量、顺序向量、non-sequential 向量和矩阵。此外,输出具有与输入相同的维度:
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
我正在尝试更改 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
更快的方法 - 使用 1 个 for 循环
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将结果作为向量,无论输入是单个整数还是数组。因此我修改了函数 return a
而不是 f
.
function a = rtfib(n)
a = [];
然后,我们需要检查输入是整数还是数组,使用numel
。因为 numel
returns 1 对于单个整数和 returns 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
此函数也适用于标量、顺序向量、non-sequential 向量和矩阵。此外,输出具有与输入相同的维度:
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