我有一个任意维度m
x n
的矩阵A
,并希望使用一个方程来填充它,例如,对于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,...
]
bsxfun
基于的解决方案
A = bsxfun(@plus,[1:m]'.^2,[1:n].^2)
bsxfun
对singleton dimensions
(即元素数量等于1的维度)执行array expansion
,并执行elementwise operation specified by the function handle
这将是CCD_ 10调用的第一个输入自变量。
因此,对于我们的情况,如果我们使用column vector (mx1
)和row vector (1xn)
,那么对于列出的bsxfun
代码,这两个向量都将扩展为2D matrices
,并执行elementwise summation of elements
(因为函数句柄-@plus),从而为我们提供所需的2D输出。所有这些步骤都由MATLAB内部执行。
注意:这必须在运行时性能方面非常高效,因为bsxfun
非常适合于这些与expansion
相关的问题,正如前面所描述的那样。
使用ndgrid
:的替代方案
[I, J] = ndgrid(1:m, 1:n);
A = I.^2 + J.^2;