作者dalie (新竹到台北的共乘)
看板perl
标题[问题] 二维阵列的处理
时间Sat Dec 3 23:21:21 2005
请教各位高手, 假设我有一个如下所示的阵列 : (用来模拟一个 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