Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将矩阵提升到C+的幂+;_C++_Pointers_Matrix - Fatal编程技术网

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 ;
    }
}