洛伦(Matlab)的艺术

将想法变成MATLAB

笔记

洛伦(Matlab)的艺术已退休,不会更新。

作用于矩阵中的特定元素

使用MATLAB,有几种方法可以从阵列中识别您希望执行一些操作的元素。根据您选择的元素的方式,您可以包含要折腾的元素列表,也可以如果要保留元素。而且,如果任何控制列表如何向您展示,您可能没有太多的控制权,因为列表可以从另一个计算中传递给您。列表可能是索引,下标或逻辑数组(通常称为掩码)。让我们看一下您如何到达这种情况,看看代码如何执行一个特定的操作,将所需元素值设置为0。

内容

注意:我没有讨论本文的效率。它高度依赖于原始数组中的元素数量以及将保留或扔掉多少元素。本文着重于指定要保留或更换的内容。

一般设置

这是此调查的设置。我将对所有方法使用固定矩阵,并始终以相同的最终输出。该计划是向您展示获得结果的多种方法,因为在不同情况下可能适合不同的方法。

a =魔术(17);结果= a;结果(a <平均(A(:)))= 0;

让我们看一下非零的模式结果使用间谍

间谍(结果)

方法#1-使用守护者的下标

这是元素以保持不变的元素列表。

[ra,ca] = find(a>(17^2)/2);

接下来,我们将下标转换为索引。

结果1 =零(size(a));indices = sub2ind(size(a),ra,ca);result1(indices)= a(indices);que equal(结果,结果1)
ans = 1

为什么我将下标转换为索引?让我用一个很小的例子说明。

矩阵= [-1 1 0;2 0 -2;0 3 -3] [行,cols] = find(matrix == 0)
矩阵= -1 1 0 2 0 -2 0 3 -3行= 3 2 1 cols = 1 2 3

现在,让我们看看如果我使用订阅来解决所选元素,我会得到什么:

矩阵(行,COLS)
ans = 0 3 -3 2 0 -2 -1 1 0

即使我只选择了3个元素,我也会恢复完整的矩阵。当我第一次遇到这个问题时,这绝对让我感到惊讶。发生了什么?

MATLAB将每个行元素与每个列元素匹配。矩阵([1 2 3],2)从第1列中的第1行到第3行返回元素。

矩阵(1:3,2)
ans = 1 0 3

要了解有关索引的更多信息,您可能需要阅读这些帖子或搜索MATLAB文档。

方法#2-使用守护者的索引

在这里,我们使用了单一输出形式寻找返回索引而不是下标。

inda = find(a>(17^2)/2);结果2 =零(size(a));result2(inda)= a(inda);匹配(结果,结果2)
ans = 1

方法#3-使用逻辑守护者

我们将尝试保持大约一半不变的元素。

keepa =(a>(17^2)/2);结果3 =零(size(a));result3(keepa)= a(keepa);匹配(结果,结果3)
ans = 1

Keepa是一个逻辑矩阵大小与一个。我使用逻辑索引填充结果3从中选择的值一个

方法#4-元素的下标,设置为零

相反,如果我们有一个要设置为0的候选人列表,我们有一个更轻松的时间,因为我们不需要从一个矩阵开始。相反,我们从副本开始一个

结果4 = a;[rnota,cnota] = find(a <=(17^2)/2);

将索引转换为下标,如方法#1所示。

indices = sub2ind(size(a),rnota,cnota);

现在将选定的矩阵元素归零。

result4(indices)= 0;que equal(结果,结果4)
ans = 1

方法#5-元素设置为零的索引

相反,如果我们给出了索引,我们只需跳过转换下标的步骤,并遵循与方法4中相似的逻辑。

结果5 = a;indnota = find(a <=(17^2)/2);result5(indnota)= 0;匹配(结果,结果5)
ans = 1

方法#6-使用逻辑阵列指定零元素

最后,如果我们有要设置为0的值的掩码,我们只需使用它来选择和设置元素即可。

结果6 = a;keepnota =(a <=(17^2)/2);result6(keepnota)= 0;匹配(结果,结果6)
ans = 1

您更喜欢哪种方法?

您自然会发现自己正在使用哪种方法或方法?您是否曾经将算法的逻辑倒转以适合您解决数据(INS或Ext)的思考方式?请发布您的想法这里。我期待看到他们。




以MATLAB®7.6出版

|
  • 打印
  • 发送电子邮件