【问题标题】:pass a matrix or vector to function handle in Matlab将矩阵或向量传递给 Matlab 中的函数句柄
【发布时间】:2015-07-16 17:54:19
【问题描述】:

大家!

我在 Matlab 中使用函数句柄时遇到问题。

假设我得到一个变换矩阵的函数句柄,比如说

Tf = @(alpha)reshape([cos(alpha),-sin(alpha),sin(alpha),cos(alpha)],[2,2]);

我有一个 alpha 向量

alpha_list = [alpha1; alpha2; ...];

我想得到类似的结果

[Tf1; Tf2; ...];

我尝试过类似的方法

Tf(alpha_list) feval(Tf,alpha_list) bsxfun(Tf,alpha_list)

它们都不起作用

有没有简单或神奇的方法来做到这一点?

非常感谢!

【问题讨论】:

    标签: matlab function-handle


    【解决方案1】:

    编辑:

    实现了一种使其更快的方法并添加了解释。

    使用arrayfun 允许您将函数tf 分别应用于a 的每个元素。

    虽然它以元胞数组形式输出,但您需要使用 cell2mat 将其转换回矩阵。

    tf = @(alpha) [cos(alpha),sin(alpha);-sin(alpha),cos(alpha)];
    Tf =@(a) cell2mat(arrayfun(@(A) tf(A), a, 'uni', 0));
    

    所以如果你输入一个 1xN 向量,你会得到一个 2x2N 矩阵,如果你输入一个 Nx1 向量,你会得到一个 2Nx2 矩阵。

    >> a = rand(2)
    
    a =
    
         6.323592462254095e-01     2.784982188670484e-01
         9.754040499940953e-02     5.468815192049839e-01
    
    >> Tf(a)
    
    ans =
    
      Columns 1 through 3
    
         8.066353232983801e-01     5.910494524211303e-01     9.614693800974246e-01
        -5.910494524211303e-01     8.066353232983801e-01    -2.749120425428361e-01
         9.952467051120759e-01     9.738580986754016e-02     8.541503641387258e-01
        -9.738580986754016e-02     9.952467051120759e-01    -5.200261103460884e-01
    
      Column 4
    
         2.749120425428361e-01
         9.614693800974246e-01
         5.200261103460884e-01
         8.541503641387258e-01
    
    >> Tf(a) - [tf(a(1,1)), tf(a(1,2)); tf(a(2,1)), tf(a(2,2))]
    
    ans =
    
         0     0     0     0
         0     0     0     0
         0     0     0     0
         0     0     0     0
    

    【讨论】:

    • 酷!它确实奏效了!但我不太明白你的技术。 “细胞”是什么意思?为什么要这样编码?
    • @YiHu 我真的建议在深入研究之前先看看一些关于元胞数组的 MATLAB 教程。这是一个很好的答案,但我会推迟尝试准确理解发生了什么,直到您阅读单元阵列是什么以及它们与普通阵列有何不同。
    【解决方案2】:

    致电Tfs寻求解决方案:

    Tf = @(a)[cos(a),sin(a); -sin(a), cos(a)];
    Tfs = @(a) reshape(Tf(reshape(a,[1,1,length(a)])),[2,2*length(a)])'
    

    这里的关键是我使用 reshape 将向量指向第 3 维,这样它就不会干扰我们感兴趣的 2。然后我们可以在输出上再次使用 reshape 来保留块您正在寻找的结构。

    这样,调用Tfs([1,2,2]) 将返回:

     0.5403    0.8415
    -0.8415    0.5403
    -0.4161    0.9093
    -0.9093   -0.4161
    -0.4161    0.9093
    -0.9093   -0.4161
    

    我还应该指出,如果您不太关心速度,可以使用简单的循环来实现更简单的方法...

    编辑: 我打开了 Tf(a) 的标志,因为它正在输出 Tf(a)'。现在是正确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-18
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2020-02-23
      相关资源
      最近更新 更多