2013-04-11 68 views
1

在MATLAB中,feedforwardnet(8)创建一个包含8个隐藏神经元的隐藏层的前馈网络。 MATLAB将数字数据存储为双精度浮点数(双精度)by default。因此feedforwardnet(8)相当于feedforwardnet(double(8))为什么feedforwardnet(int32(8))在feedforwardnet(double(8))不会引发错误?

然而,feedforwardnet(int32(8))会引发以下错误:

Undefined function or variable 'ind'. 

Error in network/subsasgn>setLayerSize (line 1170) 
    err = sprintf('"layers{%g}.size" must be a positive integer.',ind); 

Error in network/subsasgn>network_subsasgn (line 180) 
     if isempty(err), [net,err] = setLayerSize(net,i,newSize); end 

Error in network/subsasgn (line 13) 
net = network_subsasgn(net,subscripts,v,netname); 

Error in feedforwardnet>create_network (line 116) 
     net.layers{i}.size = param.hiddenSizes(i); 

Error in feedforwardnet (line 69) 
    net = create_network(param); 

为什么不会feedforwardnet()需要一个int32作为参数?等效地,为什么isposint()(in * network/subsasgn.m,第1169行))在给定int32(8)作为参数时返回true

该代码已经用MATLAB 2011a,2012a和2012b进行了测试。

回答

4

不知道哪个版本,您有工具箱,但修订isposint(v) 1.7测试这样的说法:

[...] 
if ~isa(v,'double') | any(size(v) ~= [1 1]) | ... 
    ~isreal(v) | v<0 | round(v) ~= v 
[...] 

这意味着它将返回false因为这是不是一个double或子类的一切double

至于“未定义的函数或变量'ind'。”消息,我的猜测会是因为代码中的错误(变量ind没有创建/分配/函数中的任何地方作为参数传递)。

+0

感谢:

a = feedforwardnet(8); b = feedforwardnet(int32(8)); 

尺寸变化不大,但是如果参数是int32(或int8/int64),返回false是什么意思?我觉得拒绝int32说这个函数需要一个整数是很奇怪的。 – 2013-04-11 22:22:04

+1

我必须承认,我不知道作者在使用'isa(v,'double')'而不是'ISNUMERIC(ⅴ)'。可能是因为使用双精度浮点数来快速执行某些库,而其他数字类型需要转换为double,这需要时间。或者,也许作者想避免追逐由混合整数/浮点算术引起的潜在错误的痛苦,并强制执行一个独特的类型来处理。或者,也许这是作者用于测试这种类型值的Matlab惯用法。 – 2013-04-11 22:38:47

+1

@FranckDernoncourt这是因为,无论何时使用“double”以外的类型进行算术运算,matlab都会将结果转换回该类型。例如:'uint16(0.6)* 2 = 2'和'class(ans)'将会是uint16。因此''isposint'函数正在测试以确保它的一个double类型的整数可能是因为一些算术将要完成,但它仍然需要一个整数。 – Justin 2013-04-11 22:39:39

1

还不能评论,所以我会发表一个答案。

编辑(您自己的风险,不经过彻底)isposint.m第9行:

% if ~isa(v,'double') | any(size(v) ~= [1 1]) | ... 
if ~isnumeric(v) | any(size(v) ~= [1 1]) | ... 

两个经历:

>> whos 
    Name  Size   Bytes Class  Attributes 

    a   1x1    31224 network    
    b   1x1    30968 network 
+0

有趣,谢谢!我猜这个大小的变化是因为'int32'是4个字节,而'double'是8个字节。 – 2013-04-11 23:04:33

+0

是的,这里的要点是,你实际上在记忆和性能方面并没有太大的收获。 除非你真的被限制使用'int',否则我会去'double'。 – Oleg 2013-04-11 23:17:03

+0

把'int'转换成'double'没什么问题,你可以使用'intmax('uint64')'和'realmax('double')'来检查,但是你会受到轻微的性能损失。 – Oleg 2013-04-11 23:22:50

相关问题