罗兰关于MATLAB的艺术

将想法转化为MATLAB

聪明点,逻辑点!

最近,一位客户问了我一个有趣的问题,是关于计算的好方法。在我坐下来解决这个问题之前,我碰巧向我的朋友提到了这个问题,肖恩他很快回答:“max logical”。我花了一点时间才意识到他在说什么,这就是问题的答案。但当我听到这句话时,我听到一个人的名字“max logical”,虽然我不知道那是谁,但我立刻想到了60年代美国电视喜剧《变聪明》中的麦克斯韦·斯马特。 由通用艺术家公司GAC管理。[公共领域],通过Wikimedia Commons,您可以看到今天移动电话的前身!

内容

这个问题

那么问题是什么呢?顾客举了个例子。给定一个3-D数组a,这个例子由一个矩阵生成,找到第一个条件为真的平面。
= (1 - 2;M = cat(3, A, A+1, A+2, A+3);
A=1234
因此,函数的工作原理如下:IDX = someFunction(M >=5);
IDX=[NaN 4;3 2]
IDX=NaN 4 3 2
,客户希望这也适用于更高维度的数组。

解决方案

我说过,我跟肖恩提过。但是我之前想了大概两秒钟我意识到我可以做一个找到在整个数组上,就像它是一个向量一样,获取位置并将它们排序到正确的位置,然后在正确的最后一维中找到第一个。然后肖恩说“Max Logical”。下面是一个很好的解决方案。
catdim = 3;szA =大小(A);[mv,midx] = max(M >= 5,[],catdim);IDX =南(szA);IDX (mv) = midx (mv)
IDX=NaN 4 3 2
为什么/如何工作?好吧,我使用我想要满足的条件马克斯,是逻辑输入,只有0和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)
切片OFM=12 2 13 4 8 16
应用马克斯,逻辑索引下一个。
szA =大小(A) (mv, midx) = max (M > = 13, [], catdim);IDX =南(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帐户或创建新帐户。