罗兰在MATLAB的艺术

把想法变成MATLAB

找到最大正值下为零

最近,史蒂夫写博客讨论上下文中的代码清晰/默默无闻一行代码的解决金宝搏官方网站方案。简单的说,他解决了这个问题。找到一个数组的最大价值毗邻一个零值。必须在无数的方法,对吧?

内容

一个例子

让我从一个示例开始。问题是如果数组一个,

= (1、5、3、0、2、7 0,8,9,1 0];

正确的答案是8。

史蒂夫的第一个解决方案

史蒂夫,作为图像处理专家,立即到达使用图像处理技术解决方案。对我来说,不是那么明显发生了什么!如果我继承了这个代码,我将有一些工作我理解它。

fs = @ (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,卷积得到零的邻居,并找到最大的。唷!我现在努力工作但我得到它。

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

乔斯的解决方案下

接下来的建议似乎是乔斯。密集,但最终理解我。首先,创建一个2行向量与数据填充两端值1,和一致的第一个值大于第三,上述第二第四,等等(即。,将由2元素)。检查是否每一列的值是0。选择的数据列与零值,并找到这些值中的最大值。

fj = @ (X)马克斯(X(任何([1 X (1: end-1);X(2:结束)1]= = 0)))fj(一辆)陆地(B)
fj = @ (X)马克斯(X(任何([1,X (1: end-1); X(2:结束),1]= = 0)))= 8岁= 1

重新开始

轮到我开始考虑这个问题。首先,我想找到0的索引数组。从那里,我建立一个数组的邻居。

zind =找到(B = = 0) maxcandidates = [zind-1 zind + 1)
zind 6 maxcandidates = 3 = 4 5 5 7

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

maxcandidates = maxcandidates ((maxcandidates > 0) & (maxcandidates < =长度(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账户登录或创建一个新的。