【问题标题】:Multiply values from two arrays (Artificial Neuron)将两个数组中的值相乘(人工神经元)
【发布时间】:2015-04-20 04:38:27
【问题描述】:
////////////////////MAKE INPUT VALUES////////////////////
double *NumOfInputsPointer = NULL;
std::cout << "How many inputs?" << std::endl;
int NumOfInputs;
std::cin >> NumOfInputs;
NumOfInputsPointer = new double[NumOfInputs];
std::cout << std::endl;
double InputVal;
for(int a = 0; a < NumOfInputs; a++)
{
    std::cout << "What is the value for input " << a << std::endl;
    a+1;
    std::cin >> InputVal;
    *(NumOfInputsPointer + a) = InputVal;
}

std::cout << std::endl;

////////////////////MAKE WEIGHTS////////////////////
double *NumOfWeightsPointer = NULL; 
int NumOfWeights;
NumOfWeightsPointer = new double[NumOfWeights];
double WightVal;
for(int a = 0; a < NumOfInputs; a++)
{
    *(NumOfWeightsPointer + a) = 0.5;
}

////////////////////Multiplication BRAIN BROKE!!!!!////////////////////
double *MultiplyPointer = NULL;
MultiplyPointer = NumOfInputsPointer;
for(int a = 0; a < NumOfInputs; a++)
{
      //Stuff to do things 
}

上面的代码将创建一个人工神经元。我已经构建了一个数组,其中包含用户想要的输入数量,然后自动使每个输入的权重为 0.5。

我撞到的墙使我难以将输入值数组与其权重数组相乘,然后将它们保存在另一个数组中以便稍后相加,然后通过修改器。

我的斗争是乘法并将其保存到数组中。我希望我能很好地解释我的问题。

【问题讨论】:

  • 您在第一个 for 循环中使用 a+1;。如果你想做增量,请使用a=a+1;a++;
  • 像其他数组一样分配新数组,然后MultiplyPointer[a] = NumofInputsPointer[a] * NumOfWeightsPointer[a] ?另请阅读有关 std vector 的信息...另请注意,您在使用 NumOfWeights 之前没有初始化它...您打算让所有这些向量的大小相同吗?
  • @Guy Sirton:进行了您建议的更改,并且效果很好!修复了 NumOfWeights,并且肯定也会查看 std::vector。可能有助于清理我的代码。

标签: c++ arrays artificial-intelligence multiplication


【解决方案1】:

这段代码有很多问题。我强烈建议使用 std::vector 而不是数组。如果每个输入的权重都是 0.5,那么创建一个所有元素都是 0.5 的数组有什么意义?只需创建一个表示 0.5 权重的常量变量并将其应用于每个输入。据我所知,第二个数组是不必要的。创建最后一个数组(同样,使用向量会更容易)将类似于第一个数组,因为大小将是相同的。它基于输入的数量。所以只需创建一个相同大小的数组,循环遍历第一个数组中的每个元素,使用我上面描述的常量进行乘法运算,然后将结果存储到新数组中。

【讨论】:

  • 感谢您的帮助,本周我将花时间掌握向量。似乎它真的会清理我的代码。存在 0.5 个值的数组的原因是反向传播。所有这些值都将在未来发生进一步变化,因此需要将它们放在一个数组中,以便针对它们所尊重的输入进行更改。
【解决方案2】:

只需new 就像你对其他人所做的那样,并将乘法的结果存储在那里。

MultiplyPointer = new double[NumOfInputs];
for (a = 0; a < NumOfInputs; a++) {
    MultiplyPointer[a] = NumOfWeightsPointer[a] * NumOfInputsPointer[a];
}

话虽如此,有更好的方法来解决您的问题。已经提到了std::vector,这使得内存管理和循环位更容易。我会更进一步,合并一个包含矩阵和矩阵表达式概念的库,例如OpenCVdlib

使用来自 OpenCV 的 Mat 的示例:

cv::Mat input(NumOfInputs, 1, CV_64F, NumOfInputsPointer);
cv::Mat weights(NumOfInputs, 1, CV_64F, cv::Scalar(0.5));
cv::Mat result = input.mul(weights);

如果不修改和重用权重向量,则跳过整个过程:

cv::Mat result = input.mul(cv::Scalar(0.5));

【讨论】:

    猜你喜欢
    • 2019-03-10
    • 2013-06-22
    • 2019-02-15
    • 2018-10-23
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    相关资源
    最近更新 更多