I';我在初始化MATLAB类时遇到问题

I';我在初始化MATLAB类时遇到问题,matlab,class,oop,object,initialization,Matlab,Class,Oop,Object,Initialization,我不熟悉用MATLAB进行面向对象编程,我在初始化我正在构建的类时遇到了问题。我正在从头开始构建一个神经网络,我正在使用以下名为“网络”的类以及名为“层”的初始化函数: classdef network properties sizes biases weights nLayers end methods function [ ] = layers(self) self.nLayers = length(self.sizes);

我不熟悉用MATLAB进行面向对象编程,我在初始化我正在构建的类时遇到了问题。我正在从头开始构建一个神经网络,我正在使用以下名为“网络”的类以及名为“层”的初始化函数:

classdef network

properties
    sizes
    biases
    weights
    nLayers
end

methods
    function [ ] = layers(self)
        self.nLayers = length(self.sizes);
        self.biases{1} = zeros(self.sizes(1));
        for i = 2:self.nLayers
            self.biases{i} = zeros(self.sizes(i), 1);
            for j = 1:self.sizes(i)
                bias(j, 1) = normRand(0);
            end
            self.biases{i} = bias(1:j, 1);
        end
        for i = 2:self.nLayers
            for j = 1:self.sizes(i)
                 for k = 1:self.sizes(i-1)
                     weight(j, k) = normRand(0);
                 end
            end
            self.weights{i} = weight(1:j, 1:k);
        end
    end
因此,在我创建一个类网络的可变网络并设置大小如下:

>> net = network; net.sizes = [2 3 2 4]

net = 

  network with properties:

  sizes: [2 3 2 4]
 biases: []
weights: []
nLayers: []
我运行layers函数,但没有任何更新

>> net.layers
>> net

net = 

  network with properties:

  sizes: [2 3 2 4]
 biases: []
weights: []
nLayers: []
让我困惑的是,如果我在layers函数的末尾设置了一个断点,我会在调试模式下得到以下结果:

>> net.layers
29          end
K>> self

self = 

  network with properties:

  sizes: [2 3 2 4]
 biases: {[2×2 double]  [3×1 double]  [2×1 double]  [4×1 double]}
weights: {[]  [3×2 double]  [2×3 double]  [4×2 double]}
nLayers: 4
这就是我想要的结果。知道我做错了什么吗?另外,是否有人知道如何将输入传递给类,以便我可以创建网络,如: 网络=网络(大小) ?

而且,我知道python对于神经网络来说更好,甚至java也是更好的选择。我这样做是作为一种学习练习,我对任何人关于哪种语言最适合这种学习的观点都不感兴趣


谢谢

您需要从
方法返回修改后的
self
对象:

function self = layers(self)
  ...
这是因为MATLAB中的类默认为类(即修改对象的方法必须将修改后的对象作为输出参数返回)。或者,您也可以通过使类成为一个类来设计具有类似引用的行为的类。可以找到一些有用的value和handle类示例,以及何时使用它们的指南

此外,您可以为类对象创建一个,它可以接受一组输入来初始化它。例如,它可以这样设计:

function self = network(sizes, biases, weights, nLayers)
  if (nargin > 0)
    self.sizes = sizes;
  end
  if (nargin > 1)
    self.biases = biases;
  end
  if (nargin > 2)
    self.weights = weights;
  end
  if (nargin > 3)
    self.nLayers = nLayers;
  end
end
然后您可以这样实例化它:

net = network([2 3 2 4]);  % Sets sizes to [2 3 2 4] and other properties to []

Matlab有两种类型的类-值类和句柄类。默认情况下,Matlab的类是值类,这意味着Matlab操作对象的副本,而不是对象的引用。在本例中,
layers
方法正在对对象的副本进行操作,
net
对象不会像您观察到的那样进行更新

本文详细解释了这些差异:

有两种解决方案:

1) 继续使用value类,并从
layers
函数返回修改过的对象

function self = layers(self)
然后使用赋值更新对象

net = net.layers
2) 通过从句柄类派生
网络
来使用句柄类

classdef network < handle
classdef网络
layers
功能现在将修改对对象的引用

net = net.layers
下面的链接包含有关Matlab中对象修改的更多信息