c++ - 动态二维数组丢失第二维

标签 c++ multidimensional-array

我有一个动态分配的二维数组,它被填充在一对 for 循环中。由于某种原因,在 for 循环结束时,所有元素都在不可访问的内存中。

/*************Start Positive Phase*************************/
double *posHidActivations = new double[FEATURES];
memset(posHidActivations, 0, sizeof(double)*FEATURES);

double *posVisActivations = new double[m_NumRatings];
memset(posVisActivations, 0, sizeof(double)*m_NumRatings);


double **posProducts = new double*[FEATURES];
for(int i=0; i<FEATURES; i++)
   posProducts[i] = new double[m_NumRatings];
for(int i=0; i<FEATURES; i++)
   for(int j=0; j<m_NumRatings; j++)
      posProducts[i][j] = 0;
/* manually verified elements are valid and 
   initialized to 0 with gdb */

// for each hidden node
for(int j=0; j<FEATURES; j++)
{   
   // sum up inputs from the visible layer
   for(int i=0; i<m_NumRatings; i++)
   {   
      double input = m_VisLayer[i]*m_Weights[i][j];
      double prob = sigmoid(input, m_HidItemBias[j]);
      posProducts[j][i] = m_VisLayer[i]*prob;
      posVisActivations[j]+=m_VisLayer[i];   // commenting out this line fixes
      posHidActivations[j]+=prob;
   }   
   // posProducts[i][0] is valid here
}  
/* posProducts[0][0] is a segfault 
   using gdp verified that posProducts is a valid double**
   and posProducts[0] is a valid double*

上一个代码段中没有的标识符声明:

int m_NumRatings;

m_VisLayer = new double[m_NumRatings];

m_Weights = new double* [m_NumRatings];
for(int i=0; i<m_NumRatings; i++)
   m_Weights[i] = new double [FEATURES];

m_HidItemBias = new double[FEATURES];

'FEATURES' 是一个#defined 常量

编辑:我忘记说了。程序的后面是一个逻辑相同的代码块,使用不同的标识符(posProducts -> negProducts、m_VisLayer -> m_HidLayer 等)。该 block 没有显示任何相同的症状。无论我对比多少次代码,我都找不到任何逻辑差异。

最佳答案

如您所见:

posVisActivations[j]+=m_VisLayer[i];   // commenting out this line fixes

posVisActivations 的索引是 j,范围从 0 到 m_FEATURES,但 posVisActivations 被声明为一个包含 m_numRatings 个元素的数组。

因此,您正在写入数组末尾。您可能打算使用 i 作为索引:

posVisActivations[i]+=m_VisLayer[i];   // commenting out this line fixes

HTH.

关于c++ - 动态二维数组丢失第二维,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5927217/

相关文章:

c# - 旋转多维数组的部分

c++ - native c++ 编译器和 .net c++ 编译器有什么区别?

c++ - 将文件从 vb.NET 客户端发送到 C++ 服务器

c++ - 在 C++ 中分区和格式化 USB 闪存驱动器时出错

C++读入二维数组问题

loops - 如何在 Lua 中的二维表上创建迭代器?

go - 需要将 2 维数组转换为字符串并将最后一个逗号替换为句号。(Golang)

java - 在狐狸和兔子模拟中,同一 field 内有多种动物

c++ - Mac 上架构 x86_64 的 undefined symbol

c++ - 如何将图像(BYTE*)转换为 Base64