【问题标题】:Logical Indexing with multiple replacements in MATLAB在 MATLAB 中具有多个替换的逻辑索引
【发布时间】:2014-05-26 08:52:31
【问题描述】:

"编写一条 Matlab 指令,它将采用向量 x 并将其更改为 y,以便将大于 1x 的任何元素设置为 y=1; 小于 x 的每个元素-1 设置为 y=-1; 并且对于 x 的元素 -1 和 +1 我们有 y=x。在 k 上测试它,其中 t=linspace(0,10,400)x=2*sin(pi*t),和在同一轴上绘制 xy。"

到目前为止,我已经让这段代码工作了:

t=linspace(0,10,400);
x=2*sin(pi*t);
y(x>1) = 1; y(x<-1) = -1;  y(x>-1 & x<1) = 0;
hold on;
plot(x);
plot(y,'r')
legend('x','y')

但我相信有一种更简洁的方法来编写我的代码的第 3 行,这样它就不需要 3 个单独的语句,只需要 1 个。希望有人能提供帮助,谢谢!

【问题讨论】:

    标签: matlab indexing logical-operators


    【解决方案1】:

    试试这个:

    y = x .* (abs(x) <= 1) + (x > 1) - (x < -1);
    

    说明:

    假设你有x = [-2.0 -1.5 -1.0 -0.5 0 0.5 1.0 1.5 2.0]

    让我们把表达式分成三部分,看看结果:

    (1) abs(x) <= 1 --> 0  0  1  1  1  1  1  0  0
    (2) x > 1 --------> 0  0  0  0  0  0  0  1  1
    (3) x < -1 -------> 1  1  0  0  0  0  0  0  0
    

    请注意,(1) 部分的 x 介于 -11 之间,(2) 部分的 x 大于 1(3) 部分的部分x 小于 -1

    我们首先要做的是 (1)x 部分之间的点积,这给了我们这样的结果:

    x .* (abs(x) <= 1) -> 0.0 0.0 -1.0 -0.5 0 0.5 1.0 0.0 0.0]
    

    现在,我们将(2) 部分与此相加,以用 1 填充向量(在本例中,在末尾):

    x .* (abs(x) <= 1) + (x > 1) -> 0.0 0.0 -1.0 -0.5 0 0.5 1.0 1.0 1.0]
    

    最后,我们减去 (3) 部分,所以它将用 -1 填充剩余的零:

    x .* (abs(x) <= 1) + (x > 1) - (x < -1) -> -1.0 -1.0 -1.0 -0.5 0 0.5 1.0 1.0 1.0]
    

    【讨论】:

    • 哇,谢谢!这正是我一直试图找到的。你甚至让我意识到我自己做错了问题。你认为你可以解释它是如何工作的吗?我在跟踪它时遇到了一些麻烦,我不确定我是否能找到它。
    • 非常感谢!你帮了大忙。
    • 我得问一下,我不知道为什么第 2 部分和第 3 部分分别用 1 和 -1 替换 x 的值,而不是第 1 部分,它只是得到x 和 1 中的值。为什么第 2 部分没有与第 1 部分相似的输出,而第 3 部分输出 x 值的相反值?
    • 第 2 部分是一个向量,其中仅包含 x 大于 1 的向量,而其他地方的向量为零。如果将该向量与第 1 部分的向量相加,则每个值有两种情况:如果第 2 部分的值为零,则和将保持第 1 部分的值,因为任何加零等于零;如果第 2 部分的值为 1,则总和也将为 1,因为在这些情况下第 1 部分为零。第 3 部分也是如此,只是我们想用 -1 而不是 1 替换零。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 2016-10-30
    相关资源
    最近更新 更多