C++ 如何使用斐波那契序列上的2D数组对矩阵进行乘法?
我遇到的问题是,我不确定如何用相同的矩阵一次又一次地将矩阵相乘。我试图实现的是,我希望能够更新矩阵。这是我的密码:C++ 如何使用斐波那契序列上的2D数组对矩阵进行乘法?,c++,fibonacci,C++,Fibonacci,我遇到的问题是,我不确定如何用相同的矩阵一次又一次地将矩阵相乘。我试图实现的是,我希望能够更新矩阵。这是我的密码: 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) {
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];
}
intfib3(inta,intb,intn){
int num[2][2]={{0,1},{1,1};
const int num2[2][2]={{0,1},{1,1};
int-factArray[2][1]={{0},{1};
如果(n==0){
返回a;
}
else如果(n==1){
返回b;
}
否则{
对于(int i=0;i矩阵表示中的公式主要用于理论分析。诀窍在于,向量中始终可以有序列的两个元素,而不必参考序列的早期元素。然而,要实现它,我看不到与使用递归公式相比的好处。第二,使用t
| 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>;
现在应该直接实现斐波那契序列了
请删除图像链接并将代码张贴在此处。请将过去的代码张贴在此处!我已更新了post@user4630535818问题是,我不知道如何将2x2矩阵提升到某个幂次。我知道的代码中的问题是,我正在重新分配2d数组的值,这是有问题的。@kingw3我希望它这样做比斐波那契序列的递归函数定义要快。我想要一个矩阵的迭代函数实现。
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;
}