[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dennou-ruby:003987] GAnalysis::covariance のバグ



�Ƿ����ޡ��Ǿ Ruby �Τߤʤ��� ���M2 �ξ���Ǥ���

GAnalysis::corelation ��äƤ��Ƶ�������ΤǤ�����GAnalysis::covarinace �˥Х��򸫤Ĥ��ޤ�����
�ѥå������Ƥߤޤ����Τǡ�ź��������ޤ� (�ʸ������������)��GPhys �ΥС�������1.5.0-1 �Ǥ���

����nary.div!(ndiv-1) �Ȥ��������ʤ������ޤ�����NArrayMiss#div! ���ɤ������Ǥʤ��褦�Ǥ���
irb �ǻ�������ʲ��Ǥ���������nary ��NArrayMiss��ndiv ��NArray::LINT �����������ޤ��Τǡ�
�������碌�Ƥ��ޤ���������Ƥ����ȡ�ruby-narray-miss (debian �ѥå�����) �ΥС�������1.2.8-3
�ߤ����Ǥ���

---------- irb �¹���������---------
irb(main):001:0> require 'numru/gphys'; include NumRu
=> Object
irb(main):002:0> a = NArrayMiss[10.0, 20.0, 30.0]
=> NArrayMiss.float(3):
[ 10.0, 20.0, 30.0 ]
irb(main):003:0> b = NArray[20, 40, 60]
=> NArray.int(3):
[ 20, 40, 60 ]
irb(main):004:0> a.div!(b)   <---- ���᥽�åɤΤĤ�
=> NArrayMiss.float(3):
[ 0.5, 0.5, 0.5 ]
irb(main):005:0> a
=> NArrayMiss.float(3):
[ 10.0, 20.0, 30.0 ]             <---- �ºݤˤ���Ǥ������ʤ�
---------- irb �¹������ޤ�----------

�ޤ��������ơ�����������ꤹ��ư��ޤ���������̾��������顼�ˤʤ�����
GAnalysis::covariance �ǤϽ�������������Ф��ơ�GAnalysis::corelation �Ǥϼ������ʤ�
�Τǡ�NArray#sum(*dims) �¹Ի��˥��顼���Фޤ����ʤΤǡ����������Ǥ������ˤ��Ƥߤޤ���
(�Ȥ��äƤ⥳�ԡ���������Ǥ�������

�ʲ��������Ƥߤޤ����ѥå�Ǥ��������ʤ������������������������Ǥ���

---------- �ѥå��������---------
--- covariance.rb.org   2016-08-30 15:39:35.806303482 +0900
+++ covariance.rb       2016-08-30 15:37:37.692734362 +0900
@@ -48,7 +48,8 @@
         nary /= (ndiv-1)
         return UNumeric.new(nary, units), ndiv
       else
-        nary.div!(ndiv-1)
+        ndiv = ndiv.sum(*dims)
+        nary = nary.div!(ndiv-1)
         vary = VArray.new(nary,
                           {"long_name"=>"covariance","units"=>units.to_s},
                           "covariance")
@@ -79,6 +80,12 @@
       gphys0 = gphys0.copy.replace_val(val0)
       gphys1 = gphys1.copy.replace_val(val1)

+      if dims.length == 0
+        dims = Array.new
+        gphys0.rank.times{|i| dims.push i }
+      else
+        dims = dims.map{|dim| gphys0.dim_index(dim) }
+      end
       covariance, ndiv = gphys0.covariance(gphys1,*dims)
       return covariance/(gphys0.stddev(*dims)*gphys1.stddev(*dims)),
mask.to_type(NArray::LINT).sum(*dims)
     end
---------- �ѥå�����ޤ�----------

-- 
��� �˹�Fumitaka MATSUBA)
��������� ��ظ��� �����ʳ�칶
�����ض��� ���ݳظ��漼 M2
E-mail: matsuba@xxxxxxxxxxxxxxxxxx