罗兰关于MATLAB的艺术

将想法转化为MATLAB

找出紧挨着零的最大正值

最近,Steve写了一篇博客讨论代码的清晰/模糊一行代码的解决万博 尤文图斯方案。简单地说,他解决的问题是这样的。查找数组中与零值相邻的最大值。肯定有无数种方法,对吧?

内容

一个例子

让我以一个例子开始。如果问题数组是一个

A = [1, 5, 3, 0, 2, 7, 0, 8, 9, 1 0];

正确答案是8。

史蒂夫的第一个解决方案

作为一名图像处理大师,Steve立即找到了使用图像处理技术的解决方案。对我来说,不太明显是怎么回事!如果我继承了这段代码,我就需要做一些工作来理解它。

fs = @(A) max(A(imdilate(A == 0, [1 1 1])));fs (A)
ans = 8

只适用于正价值

史蒂夫随后注意到,他的解决方案只适用于正值。

B = [5 4 -1 0 -2 0 -5 8];fs (B)
ans = 0

史蒂夫的第二个答案

于是史蒂夫又试了一次。再说一次,虽然我知道面具是什么,但我不完全理解解决办法,可能会求助于阅读imdilate文档从图像处理工具箱

zero_mask = (B == 0);Adjacent_to_zero_mask = imdilate(zero_mask, [1 0 1]);max_value_adjacent_to_zero = max (B (adjacent_to_zero_mask))
max_value_adjacent_to_zero = 1

道格的回答

在这里我们看到道格的答案,没有依赖任何东西,除了MATLAB。很好的解决方案,但我需要考虑一下。再说一遍,我知道什么是面具,我知道我们在找什么除以0后的值,我们会找到这些0,卷积得到这些0的邻居,然后找出它们的最大值。唷!我现在很努力,但我明白。

掩码= isnan (conv(1。/ B (0 1 0),“相同”));fd = @(B) max(B(isnan(conv(1)))/ B (0 1 0),“相同”))));fd (B)
ans = 1

乔斯的解决方案下

下一个建议来自乔斯。虽然晦涩难懂,但我最终还是能理解的。首先,创建一个2行向量,数据在每一端填充值1,并对其进行对齐,使第一个值高于第3个值,第二个高于第4个值,等等(即移动2个元素)。检查每一列,看看是否有值为0。从值为0的列中选择数据,并查找这些值的最大值。

fj = @(X) max(X(any([1 X(1:end-1)));X(2:end) 1]==0))) fj(A) fj(B)
fj = @ (X)马克斯(X(任何([1,X (1: end-1); X(2:结束),1]= = 0)))= 8岁= 1

重新开始

轮到我重新开始思考这个问题了。首先,我想找到数组中0的下标。从那里,我构造了一个邻居数组。

zind = find(B==0) maxcandidates = [zind-1 zind+1]
Zind = 4 6 maxcandidates = 3 5 5 7

接下来,我清除范围之外的值(可能是第一个和最后一个)。

maxcandidates = maxcandidates((maxcandidates > 0) & (maxcandidates <= length(B))))
Maxcandidates = 3 5 5 7

现在我索引到我的候选并得到最大值!

马克斯(B (maxcandidates))
ans = 1

正如厨师泰尔所说,“非常简单,非常简单。”

我可以用一句话写出这个算法,但我担心它会立刻失去清晰度。

重复的零-问题陈述的清晰性

我想知道如果有重复的零,这个问题的发起者会想到什么结果。为什么?因为我可能会得到一个零结果?目的是?这里所有的解决方万博 尤文图斯案都允许这样做,所以我的方案也允许这样做,我不需要做更多的事情。让我们看看发生了什么。

C = [1 2 -4 0 0];fj (C)
ans = 0

你的想法呢?

在MATLAB中编写精巧、紧凑和非常密集的一行程序肯定是有趣和具有挑战性的。但之后回到那个代码,破译它以便更新之类的恐惧,通常并不适合我。我喜欢在写代码的时候,注释不必比代码长很多!你是怎么想的?将它们贴在这里




MATLAB®7.8发布

|

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。