2012-03-14 50 views
1

如果我有一個形狀爲100,10000的Narray,並且想要將其展開爲100,20000(基本上添加行),那麼實現此目的的正確方法是什麼?爲了擴大大規模的Narrays,我想避免使用臨時Narray出於記憶的原因。如何展開/縮小二維Ruby NArray?

+0

您是否在API中嘗試了[.newdim(100,20000)'as [提及](http://structure.m.u-tokyo.ac.jp/ruby-helix/node5.html#SECTION005111000000000000000)? – 2012-03-14 12:00:06

回答

1
require "narray" 

class NArray 
    def expand(*new_shape) 
    na = NArray.new(self.typecode,*new_shape) 
    range = self.shape.map{|n| 0...n} 
    na[*range] = self 
    return na 
    end 
end 

p a = NArray.float(2,3).indgen! 
# => NArray.float(2,3): 
# [ [ 0.0, 1.0 ], 
#  [ 2.0, 3.0 ], 
#  [ 4.0, 5.0 ] ] 

p a.expand(3,4) 
# => NArray.float(3,4): 
# [ [ 0.0, 1.0, 0.0 ], 
#  [ 2.0, 3.0, 0.0 ], 
#  [ 4.0, 5.0, 0.0 ], 
#  [ 0.0, 0.0, 0.0 ] ] 

沒有通用的方法來擴展沒有移動的內存塊。 僅當有足夠的空閒區域時,內存塊才能被擴展, 但這種情況通常是意外的。

+0

感謝masa。我不知道NArray是如何實現的,但是我有限的C經驗告訴我應該有可能重新分配和調整存放NArray的內存塊的大小。也許將來呢? – maasha 2012-03-14 13:04:06

+0

我上面的評論對於realloc是正確的。當分配更大的大小時,realloc函數將返回一個不同的指針。 – masa16 2012-03-14 13:28:21