【问题标题】:How to fill a matrix using an equation in MATLAB?如何在 MATLAB 中使用方程填充矩阵?
【发布时间】:2014-09-17 08:34:02
【问题描述】:

我有一个任意维度的矩阵A m x n 并希望使用等式填充它,例如,对于A 的每个元素 a_ij,i = 1,...,m和 j=1,...,n,我想要,

a_ij = i^2 + j^2.

在matlab中手动填写会出现类似这样的,

A = [1^2+1^2, 1^2+2^2, ..., 1^2+j^2, ..., 1^2+n^2;
     2^2+1^2, 2^2+2^2, ..., 2^2+j^2, ..., 2^2+n^2;

     .
     .
     .

     i^2+1^2, i^2+2^2, ..., i^2+j^2, ..., i^2+n^2;

     .                                       
     .
     .

     m^2+1^2, m^2+2^2, ..., m^2+j^2, ..., m^2+n^2]

所以前几个术语是:

[2, 5, 10,17,...

 5, 8, 13,20,...

 10,13,18,25,...

 17,20,25,32,...
]

【问题讨论】:

  • 他们都工作得很好。谢谢你们。另外,对不起,我是 MATLAB 和这个论坛的新手。我以为我设置了一个电子邮件提醒,以知道显然没有提出问题。

标签: matlab matrix


【解决方案1】:

bsxfun 基于解决方案 -

A = bsxfun(@plus,[1:m]'.^2,[1:n].^2)

bsxfunsingleton dimensions 上执行 array expansion(即元素数等于 1 的维度)并执行 elementwise operation specified by the function handle 这将是bsxfun 调用的第一个输入参数。

所以对于我们的例子,如果我们使用column vector (mx1) 和row vector (1xn),那么使用列出的bsxfun 代码,这两个向量都将扩展为2D matrices 并执行elementwise summation of elements(因为函数句柄 - @plus),为我们提供所需的 2D 输出。所有这些步骤都由 MATLAB 在内部执行。

注意:这在运行时性能方面必须非常有效,因为 bsxfun 非常适合这些 expansion 相关问题,正如前面所述的定义。

【讨论】:

  • bsxfun 太有趣了!
  • 感谢您的回答。这是一个很好的简洁公式,但我并不真正理解方程/函数的含义或告诉 MATLAB 做什么。请问@plus 是什么意思?
  • @josh 看看编辑是否更有意义? bsxfun 需要一些时间来掌握它,但它带来了可向量化代码的良好性能改进。
  • 我想我现在明白了很多。 bsxfun 对两个向量(您已经平方)进行元素操作,然后您选择操作,在本例中为 @plus。当我试图将其分解时,我愚蠢地错过了 ' 转置,所以没有看到我们如何从代码 [1:m] 中获得 (mx1)。再次感谢! :)
  • @josh 是的,我想我错过了mx1 来自 (1:m) 转置的那一点点信息。很高兴它终于对你有意义了! bsxfun规则,多尝试! :)
【解决方案2】:

使用ndgrid的替代方法:

[I, J] = ndgrid(1:m, 1:n);
A = I.^2 + J.^2;

【讨论】:

  • 等于:A = ndgrid(1:n,1:m)'.^2+ndgrid(1:m,1:n).^2
  • @A.Klomp 同意,但它更难阅读,并且可能比bsxfun 解决方案效率低
  • 完全同意。可能也比早期的 ndgrid 版本慢,因为它调用了两次。
  • 我可以看到这种方法的计算效率可能不高,但我比 bsxfun 更好地理解代码,所以我认为它会更好地为我未来的方程输入(如 i^2 + j ^2 不是我唯一需要的)。非常感谢您的帮助。
猜你喜欢
  • 2015-08-12
  • 1970-01-01
  • 2011-07-23
  • 2015-03-06
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 2012-07-28
相关资源
最近更新 更多