【问题标题】:Applying different functions to different columns of a matrix将不同的函数应用于矩阵的不同列
【发布时间】:2012-01-23 20:45:57
【问题描述】:

我有一个包含 2 列的 MATLAB 矩阵,我想在其中对每一列应用单独的函数。具体来说,我想将 5 添加到一列,将 3 添加到另一列。

例如,

a = 0 4
    2 5
    3 7
    . .
    . .
    . .

会变成

a = 5 9
    7 10
    8 12
    . .
    . .
    . .

我知道我可以使用简单的a = a + xsame 值添加到两列,但在这种情况下,我尝试分配不同的数字以添加到每一侧。

【问题讨论】:

  • 你可能的意思是:“会变成 {5 7},{7 8},{8 10}..”
  • @CaptainProg:为什么不接受更通用的解决方案,它已经内置了 matlab,因此速度更快?

标签: arrays matlab


【解决方案1】:

您可以轻松添加如下数字:

a = ones(5, 2)
b = [2 5]
c = bsxfun(@plus, a, b)

这会给你:

a =
     1     1
     1     1
     1     1
     1     1
     1     1

b =
     2     5

c =
     3     6
     3     6
     3     6
     3     6
     3     6

bsxfun 还提供了更多操作,请看这里:http://www.mathworks.de/help/techdoc/ref/bsxfun.html

【讨论】:

    【解决方案2】:

    另一种方法,这次使用repmat

    >> a = [0 4; 2 5; 3 7; 1 2]
    
    a =
    
     0     4
     2     5
     3     7
     1     2
    
    >> a = a + repmat([5, 3], size(a, 1), 1)
    
    a =
    
     5     7
     7     8
     8    10
     6     5
    

    【讨论】:

      【解决方案3】:

      你可以这样做

      a(:,1)=a(:,1)+5;
      a(:,2)=a(:,2)+3;
      

      编辑: 更通用的代码:D

      function [Result]=AddColumn(A, B)
          [aRows aCols]=size(A);
          [bRows bCols]=size(B);
      
          if(aCols~=bCols || bRows>1)
              ErrorMessage='not Matched'
              return;
          end;
      
          B=B'
          X=B*ones(1,aRows);
          X=X';
          Result=A+X;
      end
      

      【讨论】:

      • 对于更多的列来说,这不是很好的编程风格,这可以用 bsxfun 很容易地完成,对于大数字来说这可能更快:)
      • 同意,BSXFUN 是这类事情的前进方向。可惜它有这么一个不明显的名字,而且需要相当长的时间(恕我直言)才能习惯。
      • @Edric 你可以看到我的 Edit for more General 选项
      • @ajavan 你测试你的代码了吗? “ErrorMessage”应该做什么?为什么要使用复共轭转置? (事实上​​,你为什么要使用转置?)你为什么不直接使用 Col Heather 的 BSXFUN 单线?
      • @Edric 没什么,只是在命令窗口中打印一条消息(不带 ; ;) ),使用内置函数而不是 Matlab 中的循环,帮助您编写快速代码,试试吧.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多