【问题标题】:how to use bsxfun with linspace [1 5] -> [1 2 3 5 6 7]如何在 linspace [1 5] -> [1 2 3 5 6 7] 中使用 bsxfun
【发布时间】:2017-02-23 18:10:44
【问题描述】:

在 matlab 中我试图从向量中获取

start=[1 5 10]

到一个看起来像这样的解决方案,将 [1:3] 添加到每个值,扩展向量:

sol=[1 2 3 5 6 7 10 11 12]

我试过了

fun=@(a,b) a-b:a;
test=3
bsxfun(fun,start,test)

但它仅适用于第一个值 (start(1))。如何将变量 start 变成类似于解向量的东西?

Related answer I couldn't make work

【问题讨论】:

    标签: matlab vector vectorization


    【解决方案1】:

    这是因为函数的第一个和第二个输入提供给bsxfun aren't necessarily scalars。

    在您的示例中,array [1, 5, 10] 作为第一个输入传递给您的匿名函数,如果第一个输入是数组,colon 将忽略除第一个元素之外的所有元素

    colon([1 5 10], 3)
    %   1   2   3
    

    要完成您想做的事情,您只需使用@plus 将0:2 添加到start 的每个元素,并将结果重新整形为行向量。

    reshape(bsxfun(@plus, start, (0:2).'), 1, [])
    

    这实际上是将[0, 1, 2] 添加到start 的每个元素中

    bsxfun(@plus, start, (0:2).')
    % 1     5    10
    % 2     6    11
    % 3     7    12
    

    然后我们将其重塑为行向量。由于 MATLAB 使用列优先排序,因此重构后的数据将沿列向下移动并产生预期的结果。

    或者,如果您使用的是 R2016b 或更新版本

    reshape(start + (0:2).', 1, [])
    

    【讨论】:

    • 你能详细说明一下解决方案代码吗?我不知道你为什么在 reshape(start + (0:2).', 1, []) 的转换连字符前面使用一个点并查看 bsxfun(@plus, start, (0: 2)') 我真的无法跟随重塑。
    • @user2305193 ' 是一种复杂的共轭转置,通常不是人们想要的。你想要的是一个常规的矩阵转置,它由.' 给出所以对于一个实值矩阵来说没有区别(除了.' 稍微快一点),但是当你使用你的代码进行复杂的处理时,它可以防止你破坏你的结果值矩阵。 (' 是撇号 btb,- 是连字符)
    • 显然这个答案可以很容易地扩展为使用 bsxfun(@plus, start, (X:Y).') 在任一方向扩展向量。 X=-2 和 Y=2。
    猜你喜欢
    • 2021-05-30
    • 1970-01-01
    • 2011-09-08
    • 2022-10-08
    • 2022-06-17
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    相关资源
    最近更新 更多