从函数句柄创建矩阵(MATLAB)

6
我打算做的事情非常简单,但是我还没有找到合适的方法来完成它。我的一个函数句柄取决于两个变量,例如:
f = @(i,j) i+j

我的情况比较复杂。
我想要做的是创建一个矩阵M,使得:
M(i,j) = f(i,j)

当然,我可以使用嵌套循环,但我正在尝试避免这种情况。我已经成功地在Maple中以相当简单的方式完成了这个问题。
f:=(i,j)->i+j;
M:=Matrix(N,f);

(其中N是矩阵的维度)但是我需要使用MATLAB来实现。目前我还在使用嵌套循环,但非常感谢您的帮助!

1
很棒的问题@Javier,非常有用! - Sergio Haram
2个回答

3

使用bsxfun函数:

>> [ii jj] = ndgrid(1:4 ,1:5); %// change i and j limits as needed
>> M = bsxfun(f, ii, jj)

M =

     2     3     4     5     6
     3     4     5     6     7
     4     5     6     7     8
     5     6     7     8     9

如果您的函数f满足以下条件:
fun(A,B)接受任意大小但相等的数组A和B,并返回同样大小的输出。输出数组C中的每个元素仅是A和B中对应元素的运算结果。函数fun还必须支持标量扩展,即如果A或B是标量,则C是将该标量应用于另一个输入数组中的每个元素的结果。
那么您可以放弃使用ndgrid。只需在第一个向量(i)上添加转置('。')。
>> M = bsxfun(f, (1:4).', 1:5)

2
我想知道如果@plus中的f仅仅是@(i,j)i+j,是否会更有效率? - horchler
2
@horchler 对于那个特定的情况,我想是这样。ndgrid也可以被处理掉。 - Luis Mendo
非常感谢@LuisMendo!你的回答真的很有帮助。 - Javier Garcia
1
@JavierGarcia 很高兴听到这个消息!你在量子力学领域工作,哇! - Luis Mendo

0

函数句柄可以接受矩阵作为输入。只需传递一个大小为N的方阵,其中的值对应于行号i,以及一个大小为N的方阵,其中的值对应于列号j

N = 5;
f = @(i,j) i+j;
M = f(meshgrid(1:N+1), meshgrid(1:N+1)')

1
请不要仅仅发布代码作为答案,还要提供解释您的代码是如何解决问题的。带有解释的答案通常质量更高,更有可能吸引赞同。 - Mark Rotteveel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接