2013-06-20 45 views
1

我隨機填充網格,其中笛卡爾座標從0到100(100x100x100網格)進行了歸一化,並且每個數據點的「強度」從0到256進行了歸一化。這裏是我在perl中的代碼片段:計算項目放置在單元格中的次數

open(FILE,$file); 
while(sysread(FILE,$data,16)) { 
    @row=unpack("f>4",$data); # input file is binary so I had to convert here 
    $x=int((($row[0] - $xmin)/($xmax - $xmin)*10) + 0.5); # max and min variables 
    $y=int((($row[1] - $ymin)/($ymax - $ymin)*10) + 0.5); # are previously defined 
    $z=int((($row[2] - $zmin)/($zmax - $zmin)*10) + 0.5); 
    $i=int(($row[3]/62*256) + 0.5); 
    $i=255 if ($i>255); 

    $out[$x][$y][$z]=$i; # simply assigns an intensity for each data 
          # point (in random order), only 1 point can be 
          # added to each 1x1x1 cell 
} 

有些點太靠近在一起,被放置在同一個1x1x1單元中。發生這種情況時,每個強度都會覆蓋前一個強度。我如何計算在單元格中放置多於一個點的次數?

在此先感謝!

+4

哦謝謝,抱歉,我在這裏新建 –

回答

1

你可以用另一種散列做到這一點很容易地,剛剛加入所有的按鍵($x$y$z)連成一個單一的關鍵,只要你插入值的哈希值設置爲

my %visited_points; 

open(FILE,$file); 
while(sysread(FILE,$data,16)) { 
    @row=unpack("f>4",$data); # input file is binary so I had to convert here 
    $x=int((($row[0] - $xmin)/($xmax - $xmin)*10) + 0.5); # max and min variables 
    $y=int((($row[1] - $ymin)/($ymax - $ymin)*10) + 0.5); # are 
    $z=int((($row[2] - $zmin)/($zmax - $zmin)*10) + 0.5); 
    $i=int(($row[3]/62*256) + 0.5); 
    $i=255 if ($i>255); 

    my $key = "$x$y$z"; 
    # check if something already occupies this cell 
    if(exists($visited_points{$key})) { 
     # take some other action 
    } 

    $out[$x][$y][$z]=$i; # simply assigns an intensity for each data 
          # point (in random order), only 1 point can be 
          # added to each 1x1x1 cell 

    # mark that there is something in this cell 
    $visited_points{$key} = 1; 
} 

如果你想數一數,你很容易計算,只需增加數值。

+1

if-loop似乎工作得很好,謝謝!我不太瞭解「$ visited_points {$ key} = 1;」儘管如此,行仍在做。 –

+2

如果兩點是'($ x,$ y,$ z)=(11,1,1)'和'($ x,$ y,$ z)=(1,11,1)'?可能會嘗試使用'$ x:$ y:$ z'這樣的鍵。 – mob

+0

@IzaakWilliamson那麼有在Perl任何語言符號'真'和'FALSE',所以1在此爲真,0是假的。 –

0

亨特解決方案的另一個版本替換散列(使用編碼密鑰);與數組(帶有編碼索引)。

優點:可能會略微提高性能。更可能的是,沒有足夠重要的餘地,誠實地說,但做你自己的基準確定。

缺點:犧牲記憶力。如果你的網格稀疏地填充 - 比如說100萬分之一中的1000分 - 你可以在一個哈希中存儲1000個元素,但是在數組中存儲1,000,000個元素。

# my @visited_points; 

my $key = $x * 10000 + $y * 100 + $z; 

# Mark as visited 
$visited_points[$key]++; 

# Check if visited: 
if (defined $visited_points[$key]) { 
    # Bail out? 
} 

# Check how many times visited? 
# Use trinary ?: operator to gracefully convert undef to 0 
my $count = $visited_points[$key] ? $visited_points[$key] : 0; 
1

爲了使它更HPC(高性能計算)友好,我發現,而不是$關鍵,如果環,只需在數把這樣的作品了。

open(FILE,$file); 
while(sysread(FILE,$data,16)) { 
    @row=unpack("f>4",$data); # input file is binary so I had to convert here 
    $x=int((($row[0] - $xmin)/($xmax - $xmin)*10) + 0.5); # max and min variables 
    $y=int((($row[1] - $ymin)/($ymax - $ymin)*10) + 0.5); # are previously defined 
    $z=int((($row[2] - $zmin)/($zmax - $zmin)*10) + 0.5); 
    $i=int(($row[3]/62*256) + 0.5); 
    $i=255 if ($i>255); 

    $count[$x][$y][$z]+=1; 

    $out[$x][$y][$z]=$i; # simply assigns an intensity for each data 
          # point (in random order), only 1 point can be 
          # added to each 1x1x1 cell 
} 

然後,如果算上$ [$ X] [$ Y] [$ Z]大於1,這意味着一個以上的點被擺在那箱。如果它等於1,那麼只有一個點放在那裏,如果它小於1,那麼箱是空的。

相關問題