我遇到的问题是我不确定如何将一遍又一遍的矩阵乘以相同的矩阵。我想要实现的是我希望能够更新矩阵。这是我的代码:
int fib3(int a, int b, int n) {
int num[2][2] = { {0,1}, {1,1} };
const int num2[2][2] = { {0,1}, {1,1} };
int factArray[2][1] = { {0}, {1} };
if (n == 0) {
return a;
}
else if (n == 1) {
return b;
}
else {
for (int i = 0; i <= n; i++) {
num[0][0] = ((num2[0][0] * 0) + num2[0][1] * 1);
num[0][1] = ((num2[0][0] * 1) + num2[0][1] * 1);
num[1][0] = ((num2[1][0] * 0) + num2[1][1] * 1);
num[1][1] = ((num2[1][0] * 1) + num2[1][1] * 1);
}
factArray[0][0] = ((num[0][0] * factArray[0][0]) + num[0][1] * factArray[1][0]);
factArray[1][0] = ((num[1][0] * factArray[0][0]) + num[1][1] * factArray[1][0]);
return factArray[0][0];
}
在这里,我将以前的矩阵乘以一个常数矩阵,但是我不确定如何像我一样更新矩阵。
因此矩阵被提高到一定的幂。
因此,例如,我想找到第五个斐波那契数列的f(5),该序列应为5,并且在编程中得到1。
答案 0 :(得分:1)
矩阵表示中的公式主要用于理论分析。诀窍在于,向量中可以始终包含序列的两个元素,而不必引用序列的较早元素。但是,要实现它,与使用递归公式相比,我看不出有什么好处。考虑一下
| 1 1 | | a | | a+b |
| 1 0 | * | b | = | a |
因此,矩阵乘法的作用完全相同:添加最后两个元素,记住当前元素(a
)。
话虽如此,您的代码有一些问题:
a
和b
,但是您只能将它们用于序列的第一个和第二个元素。您不需要a
和b
。初始值已经在矩阵的初始值中。n
应用一次,完成”。老实说,我无法在您的代码中找到任何内容;)如果您坚持使用矩阵乘法,建议不要使用c样式的数组。他们不喜欢被人流传。请改用std::array
。我对嵌套略有厌恶,因此建议使用
constexpr size_t N = 2;
using matrix = std::array<int,N*N>;
using vector = std::array<int,N>;
std::array
可以轻松返回:
vector multiply(const matrix& a,const vector& b) {
vector result;
auto ma = [&a](size_t row,size_t col) { return a[row*N+col];};
result[0] = ma(0,0)*b[0] + ma(0,1)*b[1];
result[1] = ma(1,0)*b[0] + ma(1,1)*b[1];
return result;
}
现在,实现斐波那契序列应该很简单。