我遇到的问题是我不确定如何通过相同的矩阵一遍又一遍地将矩阵相乘。我想要实现的是我希望能够更新矩阵。这是我的代码:
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个Fibonacci序列,它应该是5,并且我在编程中得到1。
矩阵表示中的公式主要用于理论分析。诀窍在于,您可以在向量中始终包含序列的两个元素,而不必引用序列的早期元素。但是,为了实现它,我没有看到与使用递归公式相比的好处。 Condsider那个
| 1 1 | | a | | a+b |
| 1 0 | * | b | = | a |
因此矩阵乘法有效地完全相同:添加最后两个元素,记住当前的一个(qazxsw poi)。
话虽这么说,你的代码有一些问题:
a
和a
,但你只使用它们作为序列的第一和第二个元素。你不需要b
和a
。初始值已经在矩阵的起始值中。b
说“采取一些起始向量,应用矩阵matrix formula次,完成”。说实话,我在你的代码中的任何地方都找不到;)如果你坚持使用矩阵乘法,我建议远离c风格的数组。他们不喜欢被传递。请改用n
。我对嵌套有一点厌恶,因此我建议使用
std::array
constexpr size_t N = 2;
using matrix = std::array<int,N*N>;
using vector = std::array<int,N>;
s可以毫无痛苦地返回:
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;
}