matlab - 我在初始化 MATLAB 类时遇到问题

标签 matlab class oop object initialization

我是 MATLAB 面向对象编程的新手,在初始化我正在构建的类时遇到了问题。我正在从头开始构建一个神经网络,我正在使用以下名为 network 的类和一个名为 layers 的初始化函数:

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: []

我运行图层功能,但没有任何更新。

>> net.layers
>> net

net = 

  network with properties:

  sizes: [2 3 2 4]
 biases: []
weights: []
nLayers: []

令我困惑的是,如果我在图层函数的末尾设置一个断点,我会在 Debug模式下得到这些结果:

>> 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 也是更好的选择。我这样做是作为一种学习练习,我对任何人关于哪种语言最适合这个的意见并不感兴趣。

谢谢

最佳答案

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

本文详细解释了差异: https://www.mathworks.com/help/matlab/matlab_oop/comparing-handle-and-value-classes.html

这个问题有两种解决方法:

1) 继续使用值类并从layers 函数返回修改后的对象

function self = layers(self)

然后使用赋值更新对象。

net = net.layers

2) 通过从 handle 类派生 network 使用 handle 类。

classdef network < handle

layers 函数现在将修改对该对象的引用。

下面的链接包含有关在 Matlab 中修改对象的更多信息。

https://www.mathworks.com/help/matlab/matlab_oop/matlab-vs-other-oo-languages.html#bslvcv1

关于matlab - 我在初始化 MATLAB 类时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49397168/

相关文章:

python - 将 Matlab 矩阵串联转换为 Python

php - 扩展已实例化但没有 'new' 的类

c++ - 重载 '<<' 运算符的问题

Java 重写方法丢弃异常

python - 如何将带有网格网格和数组的 Matlab 代码转换为 Python 代码?

matlab - 如何在matlab中绘制坡度场

matlab - 从网站获取数据

oop - MATLAB代码的打包

PHP 多维数组 foreach

python - 使用类继承时出现类型错误