【问题标题】:Applying function to vectors row by row逐行将函数应用于向量
【发布时间】:2015-09-24 12:14:41
【问题描述】:

我正在尝试将函数应用于向量,其中对于每个新行都应用相同的函数,但变量会发生变化。例如,如果我有一个带有N 行的向量:

A = [1.2; 1.5; 1.8; 2.3; 2.7; 2.8; 2.9];

我想从n = row number 所在的每一行中减去n*0.1。因此,第 2 行中的 1.5 将减去 0.2 (2*0.1),第 6 行中的 2.8 将减去 0.6 (0.1*6),依此类推。

为了澄清我想要一个对我的文件说的函数,好的,这是行n,我想用n 乘以0.1 减去行n 中的数字。我希望代码能够逐行读取文件,因此最终结果是一个对每一行都完成了上述操作的向量。我认为需要一个循环?

我确定解决方案很简单,但我不知道该怎么做。

【问题讨论】:

    标签: matlab function loops vector


    【解决方案1】:

    我相信这应该可以解决问题:

    A
        1.2000
        1.5000
        1.8000
        2.3000
        2.7000
        2.8000
        2.9000
    
    b = A-(1:numel(A)).'*0.1
    b =
        1.1000
        1.3000
        1.5000
        1.9000
        2.2000
        2.2000
        2.2000
    

    它的作用是创建一个列向量,其值为1:numel(A),即[1; 2; 3 ...],然后将每个值乘以0.1。然后从原始向量中减去这个向量。

    如您所见,其中有一个点.'。这里并不是真的有必要,但将它包含在内是一种很好的做法。如果没有点,' 将生成 conjugate transpose,而不是 regular one。当然,转置是将水平向量转换为垂直向量。

    为了满足Divakar,谁只用bsxfun, permute and reshape就可以同时做晚餐和盖房子:

    如果你想用矩阵来代替,你可以使用repmat,或meshgrid,或者更棒的bsxfun,像这样:

    A = magic(5);
    
    b = bsxfun(@minus, A, [1:size(A,1)].'*0.1)
    b =
       16.9000   23.9000    0.9000    7.9000   14.9000
       22.8000    4.8000    6.8000   13.8000   15.8000
        3.7000    5.7000   12.7000   19.7000   21.7000
        9.6000   11.6000   18.6000   20.6000    2.6000
       10.5000   17.5000   24.5000    1.5000    8.5000
    

    更多维度?结合bsxfunpermute

    【讨论】:

    • bsxfun 用于正确矩阵的情况,虽然没有被问到!
    • 哈哈关于晚餐和房子的可爱评论,也许有一天豪宅;)
    猜你喜欢
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    相关资源
    最近更新 更多