2016-03-31 27 views
3

Ben Bool değerleri matrisi olduğu bir 0,1 matris olarak Bool bir matris,writedlm örneğin

x = bitrand(2,3) 

Ben bir dosyaya bu kaydetmeye çalışırsanız: Ben olsun

writedlm("mat.txt", x) 

true ve false matrisi. Bunun yerine 0 ve 1 matrisini almak istiyorum (burada 0 yanlış ve 1 yerini alır). writedlm'daki bazı seçeneklerle, dosya satırını kendim yazmadan, bunu yapmanın basit bir yolu var mı?

+4

'1 * x' 'i deneyin, sayısal sürüme sahip olur (belki de süper bellek/zaman açısından verimli değil, ancak" büyük veri "olmayan şeyler için yeterince iyi). 0x1 * x' bir UInt8 daha fazla bellek kompakt (ama muhtemelen daha yavaş) alacaktır. –

+1

@DanGetz Bunu bir cevap olarak göndermelisiniz. Bu en basit çözüm. – becko

cevap

3

1*x deneyin, sayısal sürümü (verimli belki de süper hafıza/saat, ama olmayan "büyük veri" şeyler için yeterince iyi) alır. 0x1*x, bir UInt8 - daha fazla bellek kompakt (ama muhtemelen daha yavaş) alacaktır.

5
writedlm("mat.txt", map(Int8,x)) 

x her öğe alır ve Int8 fonksiyonu/kurucu kullanarak bir tamsayı dönüştürür.

Diğer tamsayı türlerini de kullanabilirsiniz, ancak Int8, örneğin Int64'dan daha fazla bellek verimlidir.

+2

Aynı şeyi elde edebilecek olan Int8'i de kullanabilirsiniz, ancak daha fazla bellek verimli. 800x800 matris ile çalıştı ve 'Int64' 4.8MB, Int8 ise sadece 0.6MB kullanmıştı. – niczky12

+0

Bu, dönüştürülmüş matrisin tam bir kopyasını belleğe yüklemeyi içerir. Bu "writedlm" yi bir döngü içinde yapıyorum, bu yüzden performans etkisinin çok fazla olduğunu düşünüyorum. – becko

+0

'map' tembel bir sürümü var mı? Ben googling ama hiçbiri bulamıyorum. – becko

0

biraz daha hızlı yerine map uygulayarak daha Array{UInt8, ndims(x)}(x) olarak anında UInt8 için kopya dizi etmektir edilir Başka bir seçenek:

>>> x = bitrand(100,100) 
>>> a = map(UInt8, x) 
>>> b = Array{UInt8, ndims(x)}(x) 
>>> all(a .== b) 
true 

Ben çabuk bazı testler yaptım ve göze hitap eden daha hızlı büyüktür matrisler (en azından bilgisayarımda).

for i in [10, 100, 1_000, 10_000] 
    x = bitrand(i,i) 
    println("$i x $i") 
    @time map(UInt8, x) 
    @time Array{UInt8, ndims(x)}(x) 
end 

Çıkışlar:

10 x 10 
    0.000002 seconds (2 allocations: 208 bytes) 
    0.000006 seconds (2 allocations: 208 bytes) 
100 x 100 
    0.000053 seconds (2 allocations: 9.891 KB) 
    0.000018 seconds (2 allocations: 9.891 KB) 
1000 x 1000 
    0.001945 seconds (5 allocations: 976.703 KB) 
    0.001490 seconds (5 allocations: 976.703 KB) 
10000 x 10000 
    0.224491 seconds (5 allocations: 95.368 MB) 
    0.117774 seconds (5 allocations: 95.368 MB) 
+1

Genelde “cast” kelimesini, Julia'da “yeniden yorumlama” olarak adlandırılan, yani bellekte aynı bitlere farklı bir şekilde bakmanın anlamını anlıyorum. Burada yine bir * yeni * matris yaratıyorsunuz. –

+0

@ DavidP.Sanders * cast * 'ın bir kopya oluşturmaması gerektiği konusunda hemfikirim, belki de en iyi kelime bulamıyor (* copy *' a yeniden yazılmıştır). 'yeniden yorumlama (UInt8, x) 'x' bir" Array {Bool} "ise, en iyi çözümdür, ancak" bitrand "," yeniden yorumlama "tarafından desteklenmeyen bir" BitArray "döndürür. –