【问题标题】:Manipulate specific elements of an array操作数组的特定元素
【发布时间】:2012-05-25 06:55:02
【问题描述】:

我在 simulink 模型中有两个长度不同的矢量信号。现在,我想将较短信号的值添加到较长信号的特定元素中。让我用一个例子来解释一下:

假设,信号 A 的值为 [1 2 3 4 5],信号 B 的值为 [2 4 8]。我想将 B 的值添加到 A 的第 1、第 3 和第 5 个元素,得到 [3 2 7 4 13]。对应的 matlab-command 为 A([1 3 5])=A([1 3 5])+B

通过使用Insert Zero-Block 将 B 填充到与 A 相同的长度,然后添加两个向量,在 Simulink 中应该可以实现相同的操作。不幸的是,这个块需要我没有的通信系统工具箱。除了使用嵌入式 matlab 函数之外,您还有其他可能吗?

【问题讨论】:

    标签: matlab simulink


    【解决方案1】:

    您可以尝试使用选择器块来模拟 MATLAB 中的索引,我现在没有 Simulink,所以这里有一个模型的 powerpoint 版本。在选择器块中,您可以硬编码所需的索引,也可以使用块上的端口输入索引。

    在这种情况下,模型实现,

    Y = A([1 3 5 7 9]) + B;
    

    有关详细信息,请参阅Selector block documentation.

    【讨论】:

    • 这允许我添加以从 A 中选择一些元素并将它们添加到 B。但是如何将结果向量与 A 的其余元素合并?您的解决方案将对应于 matlab 命令 Y=A([1 3 5])+B。但我还需要将 A 的未更改元素传递给结果向量,如 A([1 3 5])=A([1 3 5])+B。
    • 尝试在 Sum 块之后使用 Assignment 块。它有一个选项,您可以在其中传入初始输出(在本例中为 A),然后是要在该向量中覆盖的值和索引。
    • 谢谢!不知道有这样的block,完美解决了我的问题。
    【解决方案2】:

    虽然我不知道如何插入零块将信号填充到相同的长度。计算您指定的索引非常容易。

    我会这样做:

    a = zeros(1000,1);
    b = rand(20,1);
    indexes = round(linspace(1,numel(a),numel(b)))
    a(indexes) = a(indexes)+b;
    

    【讨论】:

    • 感谢您的回复,但这不是我想要的。我已经有一个带有索引的向量。但是我不知道如何在不使用插入零块(我没有)的情况下在simulink中实现a(indexes)= a(indexes)+b行的效果。
    • 啊-抱歉。我没有注意到您已经提到了嵌入式 matlab 函数。
    • 其实我现在用的是嵌入式matlab函数,效果很好。我仍然很想知道是否存在“纯 simulink”解决方案。
    【解决方案3】:

    这不是你的问题,但你所做的不是如何将两个不等间距的信号加在一起。问题是您没有修改A 的所有值。假设B 的值为[10 10 10]。嗯,这意味着B 有一个常数值 10,所以我们希望A 只是A + 10。不是[10 2 13 4 15]

    一般来说,您希望将信号插值到相同的间距,然后将它们相加。首先生成与数组相对应的时间向量,然后将更粗略的采样信号插值到另一个。

    % Let's say t runs from 0 to 100
    tA = linspace(0, 100, 5);
    tB = linspace(0, 100, 3);
    Bi = interp1(tB, B, tA);
    combined = A + Bi;
    

    Bi 是上面的重要变量,在您的示例中,它的值 [2 3 4 6 8]。如果你有信号处理工具箱,resample 函数可能更适合一般信号。

    因此,如果您认为这更准确地描述了信号加法,那么您就知道在 Simulink 中的何处查找。寻找 Simulink 重采样模块。

    【讨论】:

    • 我认为您的回答描述了如何添加两个具有不同采样率的信号。但这并不是我想要做的。我实际上想为每个时间步添加两个长度不等的矢量信号。因此,对于给定的 t,我可能想将 [2 4 8] 添加到 A 的第一个、第三个和第五个元素,在下一个时间步我可能想添加另一个值。另外,我不想插入 B 的值以适合 A 的长度,我真的只想添加指定的元素。因此,对于上面的示例,我希望结果为 [1 2 3 4 5]+[2 0 4 0 8] 而不是 [1 2 3 4 5]+[2 3 4 6 8]。
    猜你喜欢
    • 2015-04-19
    • 2010-12-15
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    相关资源
    最近更新 更多