罗兰谈MATLAB的艺术

将想法转化为MATLAB

聪明一点,逻辑一点!

最近一位客户问了我一个关于计算的好方法的有趣问题。在我坐下来解决这个问题之前,我碰巧向我的朋友提到了这个问题,肖恩.他很快回答:“最大限度地合乎逻辑。”我只花了一会儿时间就明白了他在说什么,这就是问题的答案。但当我听到它的时候,我听到了一个人的名字“Max Logical”,虽然我不知道这是谁,但我立刻想到了美国60年代电视喜剧《Get Smart》中的Maxwell Smart。 由通用艺术家公司- gac管理。[公共领域],通过维基共享资源,你可以看到今天的手机的前身!

内容

这个问题

那么问题是什么呢?顾客举了个例子。给定一个由矩阵生成的3-D数组a,找出满足某些条件的第一个平面。
= (1 - 2;3 4] M = cat(3, A, A+1, A+2, A+3);
A = 1 2 3 4
所以函数应该是这样工作的:IDX = someFunction(M >=5);
IDX = [NaN 4;3 2]
IDX = NaN 4 3 2
,客户希望它也适用于更高维度的数组。

解决方案

我说过,我跟肖恩提过。但我之前想了两秒钟,我意识到我可以做一个找到在整个数组上,就像它是一个向量一样,获取位置并将它们排序到适当的位置,并在正确的最后一个维度中找到第一个。然后肖恩说"合乎逻辑"下面是一个伟大的解决方案。
Catdim = 3;szA =大小(A);[mv,midx] = max(M >= 5,[],catdim);IDX = NaN(szA);IDX(mv) = midx(mv)
IDX = NaN 4 3 2
为什么/如何起作用?我把我想要满足的条件用在函数里马克斯,它是逻辑输入,意思是只有0和1。和马克斯返回满足第一个条件的索引,并沿着最后一个维度执行此操作。的数组值,并使用逻辑索引更新此索引矩阵。瞧!

更高的维度

现在让我们看看它在高维下是否有意义。为了简单起见,我将再次提供一个比我最终寻找的小1维的基本数组,这样我就可以构造一些我可以相当容易地检查结果的东西。
A = randi(17, [3 2 1 3]);M = cat(catdim, A, A+1, A+2, A+3, A+4);
Catdim = 5
看M的切片
sliceOfM = M(:,:,:,1)
16 . sliceOfM = 12 2 13 4 8
应用马克斯,逻辑索引下一个。
szA =大小(A) (mv, midx) = max (M > = 13, [], catdim);IDX = NaN(szA);IDX(mv) = midx(mv)
szA = 3 2 1 3 IDX(:,:,1,1) = 2 NaN 1 NaN 1 IDX(:,:,1,2) = NaN 1 1 NaN 4 NaN IDX(:,:,1,3) = NaN 1 1 1 NaN 1

你接受逻辑索引了吗?

这些年来,我发了几篇帖子索引读者们觉得这很有帮助。你有什么有趣的逻辑故事可以分享吗?将它们贴在这里

发布与MATLAB®R2017b
|
  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。