【问题标题】:Repeat row vector as matrix with different offsets in each row将行向量重复为每行中具有不同偏移量的矩阵
【发布时间】:2017-08-12 12:14:43
【问题描述】:

我想重复一个行向量来创建一个矩阵,其中每一行都是原始向量的略微修改版本。

例如,如果我有一个向量v = [10 20 30 40 50],我希望矩阵的每一行都是该向量,但在向量的每个元素上添加一个随机数以增加一些波动。

我的矩阵应该是这样的:

M = [10+a 20+a 30+a 40+a 50+a; 
     10+b 20+b 30+b 40+b 50+b; 
     ... ]

其中ab、... 是 0 到 2 之间的随机数,用于任意数量的矩阵行。

有什么想法吗?

【问题讨论】:

    标签: matlab matrix vector


    【解决方案1】:

    在 Matlab 中,您可以将列向量添加到矩阵中。这将相应地将向量元素添加到每个行值。

    例子:

    >> M = [1 2 3; 4 5 6; 7 8 9];
    >> v = [1; 2; 3];
    >> v + M
    
    ans =
    
         2     3     4
         6     7     8
        10    11    12
    

    请注意,在您的情况下,v 是一个行向量,因此您应该先转置它(使用 v.')。

    正如Sardar UsamaWolfie 注意,这种添加方法只能从 MATLAB R2016b 版本开始使用,对于早期版本,您需要使用 bsxfun

    >> % instead of `v + M`
    >> bsxfun(@plus, v, M)
    
    ans =
    
         2     4     6
         5     7     9
         8    10    12
    

    【讨论】:

    • ' 不是转置。 .' 是。 R2016b 中引入了隐式扩展。对于早期版本,请使用 bsxfun。即bsxfun(@plus,v.',M)
    • 嗨,Daan,你的回答对我不适用。如果我使用您的代码,我会收到一个错误:错误使用 + 矩阵尺寸必须一致。测试错误(第 3 行)v + M
    • @Surstroemmingpirat 可能你的版本不支持这个。尝试通过v = repmat([1, 2, 3].', 1, size(M, 1)) 初始化v 以使vM 具有相同的尺寸。这对你有用吗?
    • bsxfun(@plus, v.', M) 等效于 v.' + M,而不是 v+M。 (我在评论中使用了 v.',因为 OP 将 v 作为行向量,而不是列向量)
    【解决方案2】:

    如果您的 MATLAB 版本早于 2016b(引入隐式扩展时,如 Daan 的回答所示),那么您应该使用 bsxfun

    v = [10 20 30 40 50]; % initial row vector
    offsets = rand(3,1);  % random values, add one per row (this should be a column vector)
    
    output = bsxfun(@plus,offsets,v);
    

    结果:

    >> output =
       10.643   20.643   30.643   40.643   50.643
       10.704   20.704   30.704   40.704   50.704
       10.393   20.393   30.393   40.393   50.393
    

    这可以通过更少的随机输入更容易理解!

    v = [10 20 30 40 50];
    offsets = [1; 2; 3];
    
    output = bsxfun(@plus,offsets,v);
    >> output =
       11   21   31   41   51
       12   22   32   42   52
       13   23   33   43   53
    

    旁注:要获得 0 到 2 之间随机数的 nx1 向量,请使用

    offsets = rand(n,1)*2
    

    【讨论】:

    • 是的,这很有帮助,非常感谢!对阅读本文的其他人来说,一个小小的编辑:首先需要将 M 定义为每行中由 v 组成的矩阵。只需添加 M = v(ones(3,1),:);在偏移量和输出之间。
    • 糟糕,这是我的复制粘贴错字!我已将 Ms 更改为 v,现在应该可以使用了 :)
    猜你喜欢
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    相关资源
    最近更新 更多