[問題] 二維陣列的處理
請教各位高手, 假設我有一個如下所示的陣列 : (用來模擬一個 2D array)
@tb = ( [1.2, 2.3, 3.4, 4.5, 5.6], \
[2.2, 3.3, 4.4, 5.5, 6.6], \
[3.2, 4.3, 6.4, 4.5, 7.6], \
[4.2, 6.3, 5.4, 5.8, 8.6], \
[5.2, 5.3, 4.4, 6.5, 9.6] );
我想檢查在垂直方向的值, 是否都是單調 "遞增" ?
假如發現造成遞減的值, 則要進一步確認, 整個趨勢是否 "自此開始遞減" ?
也就是說, 垂直方向不能出現, "遞增, 遞減, 然後又遞增, 然後又..." 的趨勢
以上面的 table 作為例子
第一個 column 符合檢查條件 (1.2 < 2.2 < 3.2 < 4.2 < 5.2)
第二個 column 也符合, 儘管最後兩個值 (6.3 > 5.3) 是遞減, 但不違反原則
第三個 column 也符合, 因為整個趨勢自 6.4 開始遞減
第四個 column 則不符合, 因為整個趨勢先遞增, 再遞減, 而後又遞增....
=======================================================================
我寫了一段 code 來檢查垂直方向的遞增, 如下
sub check_increasing {
my ($tb_ref) = @_ ; # 從外面傳進來的 ref of @tb
my $max = -16384; # initial
my $err = 0; # return value
for my $x (0..$#{$tb_ref}) {
for my $y (0..$#{$tb_ref}->[$x]) {
my $value = $tb_ref->[$y]->[$x];
$max = $value if ($value > $max);
if ($y >= 1) {
if ($value < $max) {
print "Find non-increasing $value at $y, $x \n";
$err = ($err || 1);
}
}
}
$max = -16384; # reset
}
return $err;
}
=======================================================================
而我的問題是,
要怎麼利用上面的架構, 進一步檢查遞增, 遞減, 又遞增的錯誤?
因為對 perl 還半生不熟, 想請各位高手指點一下,
看看是否有比較好的做法? (因為我覺得上面的寫法也不漂亮)
先謝謝各位:)
--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.168.155.152
Perl 近期熱門文章
PTT數位生活區 即時熱門文章