1

每个人!

在 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)

他们都不起作用

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

非常感谢!

4

2 回答 2

2

编辑:

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

使用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
于 2015-07-16T18:18:43.107 回答
1

呼吁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)'。现在是正确的。

于 2015-07-16T18:14:47.053 回答