C++ 将矩阵提升到C+的幂+;
我写了一个函数,将矩阵提升到一定的幂。 但是当运行代码时,结果是内存位置而不是实际值。我认为问题在于指针 我的代码:C++ 将矩阵提升到C+的幂+;,c++,pointers,matrix,C++,Pointers,Matrix,我写了一个函数,将矩阵提升到一定的幂。 但是当运行代码时,结果是内存位置而不是实际值。我认为问题在于指针 我的代码: #include <iostream> using namespace std; typedef int array2d [2][2]; array2d A,B,r; void pow(array2d* r,array2d C); int main(){ array2d resa,resb; A[0][0]=2; A[0][1]=2; A[1][0]=2;
#include <iostream>
using namespace std;
typedef int array2d [2][2];
array2d A,B,r;
void pow(array2d* r,array2d C);
int main(){
array2d resa,resb;
A[0][0]=2;
A[0][1]=2;
A[1][0]=2;
A[1][1]=2;
B[0][0]=3;
B[0][1]=3;
B[1][0]=3;
B[1][1]=3;
r[0][0]=1;
r[0][1]=0;
r[1][0]=0;
r[1][1]=1;
pow(&resa,A);
for(int i=0;i<2;i++){
for(int j=0;j<2;j++)
{
cout<<resa[i][j]<<" ";
}
cout<<endl;
}
pow(&resb,B);
for(int i=0;i<2;i++){
for(int j=0;j<2;j++)
{
cout<<resb[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
void pow(array2d* r, array2d C)
{
array2d temp;
for(int w=0;w<3;w++)
{
for(int i=0;i<2;i++){
for(int j=0;j<2;j++)
{
temp[i][j]=0;
for(int k=0;k<2;k++)
temp[i][j]+=(*r)[i][k]*C[k][j];
}}
for(int i=0;i<2;i++){
for(int j=0;j<2;j++)
{
(*r)[i][j]=temp[i][j];
}}
}
}
#包括
使用名称空间std;
typedef int array2d[2][2];
阵列2d A、B、r;
无效功率(array2d*r,array2d C);
int main(){
array2d resa,resb;
A[0][0]=2;
A[0][1]=2;
A[1][0]=2;
A[1][1]=2;
B[0][0]=3;
B[0][1]=3;
B[1][0]=3;
B[1][1]=3;
r[0][0]=1;
r[0][1]=0;
r[1][0]=0;
r[1][1]=1;
pow(和resa,A);
对于(int i=0;ipow函数的第一个参数,将其更改为pass by reference:void pow(array2d&r,array2d C);
然后在你叫它的地方,像这样叫它:pow(resa,A);
最后,您现在不需要在pow函数中遵从r,因此(*r)[i][j]=temp[i][j];
可以更改为r[i][j]=temp[i][j];
我想这就是你想做的事
(我不是在一台pc前,我现在可以测试它,我会尽快确认,也许会详细说明为什么这样更好(可以读取指针、堆内存和通过引用传递)您的错误与指针或地址无关,但您的算法是错误的:
pow(&resa, A);
将矩阵A与未初始化的矩阵
resa相乘,可产生任意数量的可能结果
快速而肮脏的解决方案是将resa和resb初始化为标识矩阵:
array2d resa = { { 1, 0 }, { 0, 1 } };
array2d resb = { { 1, 0 }, { 0, 1 } };
编辑或稍好一点:在pow内部初始化r
//passing r by pointer is not actually necessary here,
//but I don't want to modify too much of the code
(r*)[0][0] = 1;
(r*)[1][0] = 0;
(r*)[0][1] = 0;
(r*)[1][1] = 1;
更优雅的解决方案是首先将参数
C
与自身相乘,将结果存储在r
中,然后继续执行算法
另一方面:如果不需要c样式的数组(特别是在typedef中)。请使用
std::array
,这将消除大多数关于参数传递的混淆。如果可以,您确实应该尽量避免使用全局数组,在全局和局部变量中使用相同的名称更糟糕
变量的名称也很重要,这里我将输入矩阵称为输入矩阵,输出矩阵称为输出矩阵(ok“n”应称为幂)
及
void pow(阵列输入、阵列输出、整数n)
{
对于(int i=0;i<2;++i)
对于(int j=0;j<2;++j)
OUT[i][j]=(i==j);
显示(输出);
阵列温度;
对于(int w=0;w请编辑您的问题,并包括您期望的结果和您得到的结果。谢谢。首先,为什么您需要3个全局矩阵来将某个矩阵提升到幂次?将矩阵提升到幂次k意味着将其自身乘以k倍,而不是将其与所有元素都为k的矩阵相乘三倍。还有yo你从不初始化resa
和resb
。这就是为什么,wp molbdnilo,本地和全局r欺骗了我的大脑。你可能想写一个小矩阵结构矩阵
,它将具有双数组。你可以写一个成员函数pow(矩阵和结果,整数幂);
。此处无需参考,您只需执行void pow(array2d r,array2d C);
它的行为与您的回答完全相同。我已根据您的建议更改了代码,但我得到以下错误:p.cpp:In函数'void pow(int()[2][2],int()[2])“:p.cpp:66:29:错误:“int[2]”和“int”到二元“运算符*”temp[i][j]+=r[i][k]*C[k][j]类型的操作数无效;^p.cpp:73:9:错误:“int”到“int[2]”r[i][j]=temp[i][j]赋值时类型不兼容”;您不需要在以下位置使用&
或*
all@Guiroux我试图删除&和*。但输出不正确。6114033232 6114033232 134312032 134312032 216 453312828 453312828请尝试我的代码,然后它就工作了,删除&和*并不能纠正您的错误,只是它们没有用,您的错误混淆了本地/global变量r,你初始化全局变量,但使用局部变量,不是,初始化非常感谢你的回答和编写函数的努力。虽然不确定这是一个好方法,但其他答案对我来说似乎更好,因为他们没有给出答案,而是给出了关于它们的线索,实际上让你思考和搜索喜欢解释而不是直接回答。这就是为什么我阅读并尝试了所有答案,并对每个答案进行了评论。我确实知道初始化和全局变量存在问题。感谢您的回答。您的建议也解决了问题。
using namespace std;
typedef int array2d [2][2];
void display( array2d a ) ;
void pow(array2d IN ,array2d OUT , int n);
int main()
{
array2d A,B;
array2d resa,resb;
A[0][0]=2;
A[0][1]=2;
A[1][0]=2;
A[1][1]=2;
B[0][0]=3;
B[0][1]=1;
B[1][0]=2;
B[1][1]=1;
pow (A , resa , 5);
pow( B , resb, 2 ) ;
return 0;
}
void pow(array2d IN, array2d OUT , int n )
{
for( int i = 0 ; i < 2 ; ++ i )
for( int j = 0 ; j < 2 ; ++ j )
OUT[i][j] = ( i == j ) ;
display( OUT ) ;
array2d temp;
for(int w=0;w<n;w++)
{
for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++)
{
temp[i][j]=0;
for(int k=0;k<2;k++)
{
temp[i][j]+=OUT[i][k]*IN[k][j];
}
}
}
for(int i=0;i<2;i++){
for(int j=0;j<2;j++)
{
OUT[i][j]=temp[i][j];
}
}
display( OUT ) ;
}
}
void display( array2d a )
{
cout << endl ;
for( int i = 0 ; i < 2 ; ++ i )
{
for( int j = 0 ; j < 2 ; ++ j )
cout << a[i][j] << " " ;
cout << endl ;
}
}