2015-11-21 23 views
4

我需要在C++中实现矩阵转置过程。 问题是签名,该函数具有被称为像这样:内存破解转置矩阵腐败堆栈,C++

transpose(in_mat[0][0], n, m, out_mat[0][0]) 

其中n和m是尺寸。 所有的值都是双精度,包括矩阵和维度。

由于代码是自动生成的,我无法解决这个问题。

我的解决办法是这样的:

void transpose(double& in_mat, const double _n, const double _m, double& out_mat) 
{ 
    int n = _n, m = _m; 
    double* in_pointer= &in_mat; 
    double* out_pointer= &out_mat; 
    for (int i = 0; i < n; i++) { 
     for (int j = 0; j < m; j++) { 
      *(out_pointer+(j*n+i)) = *(in_pointer+(i*m + j)); 
     } 
    } 
} 

它工作正常。 我已经构建了两个不同宽度和高度的矩阵的测试用例。一个充满了随机数字,另一个充满了零。然后调用转置过程并比较两个矩阵。 功能正确。

但它破坏了堆栈。在Visual Studio 2015中运行时,存在警告

运行时检查失败#2 - 变量“in_mat”周围的堆栈已损坏。

我做错了什么?为什么堆栈损坏? 调用转置后的代码正常工作。

编辑:

下面是完整的设置:

#include <random> 
#include <iostream> 

void transpose(double& in_mat, const double _n, const double _m, double& out_mat) 
{ 
    int n = _n, m = _m; 
    double* in_pointer = &in_mat; 
    double* out_pointer = &out_mat; 
    for (int i = 0; i < n; i++) { 
     for (int j = 0; j < m; j++) { 
      *(out_pointer+(j*n+i)) = *(in_pointer+(i*m + j)); 
     } 
    } 
} 


int main() 
{ 

    double in_mat[5][4]; 
    double out_mat[4][5];// assign matrix 

    for (int i = 0; i < 4; i++) { 
     for (int j = 0; j < 5; j++) { 
      in_mat[i][j] = std::rand(); 
      out_mat[j][i] = 0; 
     } 
    } 

    double n = 5; 
    double m = 4; 

    transpose(in_mat[0][0], n, m, out_mat[0][0]); 

    for (int i = 0; i < n; i++) { 
     for (int j = 0; j < m; j++) { 
      if (in_mat[i][j] - out_mat[j][i]>0.0001) { 
       std::cout << "code is broken" << std::endl; //never reached 
      } 
     } 
    } 
    std::cout << "finished" << std::endl; 
} 
+3

C中端没有引用。如果你用C++编程,请指定C++,而不是C. – fuz

+0

你是对的。我修好了它。 – lhk

+0

这些矩阵有多大?你有没有考虑过将它们分配到堆上? – simpel01

回答

7

你标(或循环限制)是向后,你初始化的矩阵。

你有

double in_mat[5][4]; 
double out_mat[4][5];// assign matrix 

for (int i = 0; i < 4; i++) { 
    for (int j = 0; j < 5; j++) { 
     in_mat[i][j] = std::rand(); 
     out_mat[j][i] = 0; 
    } 
} 

j==4你写超出out_mat

+1

好的,JSF! – godel9

+0

就是这样。谢谢 – lhk