【问题标题】:Irregular-Spaced Linear Index不规则间距线性索引
【发布时间】:2016-04-29 17:40:00
【问题描述】:

我正在尝试创建一个用作索引的线性向量。我需要在索引 x = 700、1000、1100、2100、2300、2400、2900 中的这些起始数字之间填充数字 1:99。我尝试使用各种循环,但我无法保存每个 100 个数字循环内的数组中的序列。我很想学习如何不使用循环并更简单地做到这一点。

所以 xfinal 应该看起来像 - 700, 701, 702...799, 1000, 1001, 1002...1099, 1100, 1101, 1102,...1199, 2100, 2101, 2102,...2199 , 2300, 2301, 2302,...2399, 2400, 2401, 2402,...2499, 2900, 2901, 2902,...2999。 我在敲键盘 - 谢谢!

【问题讨论】:

    标签: matlab indexing sequence vectorization fill


    【解决方案1】:

    让我们用bsxfun 保存 keyboardscary 循环 -

    x = [700, 1000, 1100, 2100, 2300, 2400, 2900];
    offset_arr = 0:99;
    xfinal = reshape(bsxfun(@plus,x,offset_arr.'),1,[])
    

    【讨论】:

    • @excaza 我想说,这需要时间! ;)
    • 太棒了。你能解释一下“@plus”、闭括号前的“1”以及闭括号的含义吗?
    • 可能都和bsxfun函数有关?再次感谢!
    • @user2100039 是的,基本思想是把一个行向量和一个列向量提供给bsxfun 进行广播。现在@plus 是要使用这两个输入执行的操作。所以,基本上我们在所有起点上添加这个 offset_array,因此我们以 2D 输出结束。最后一步是有一个行向量,即一列,这就是为什么1reshaping。如果您将代码分为两个步骤:bsxfun(@plus,x,offset_arr.'),然后是完整代码并观察输出,希望它会变得更清晰。试试看! :)
    • @user2100039 错字:我的意思是一行而不是一列
    【解决方案2】:

    一个不太紧凑,可能效率较低,没有可怕循环的键盘版本:

    x = [700, 1000, 1100, 2100, 2300, 2400, 2900];
    intermediate = 0:99;
    
    tmp = repmat(intermediate, length(x), 1) + repmat(x.', 1, length(intermediate));
    x_new = reshape(tmp.', 1, []);
    

    【讨论】:

    • 对我来说更可怕的是可能要输入所有内容:D
    • @Divakar 我做了一个keyboard saving version for you
    • 是的,这是一种解脱,尤其是intermediate变成im! ;)
    猜你喜欢
    • 2020-10-13
    • 2015-02-09
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多