【发布时间】:2014-12-22 22:31:49
【问题描述】:
我有以下代码:
n = 10000;
s = 100;
Z = rand(n, 2);
x = rand(s, 1);
y = rand(s, 1);
fun = @(a) exp(a);
原则上,匿名函数f 可以有不同的形式。我需要创建两个数组。
首先,我需要使用通用元素创建一个大小为n x s x s 的数组
fun(Z(i, 1) - x(j)) * fun(Z(i, 2) - y(k))
其中i=1,...n 而j,k=1,...,s。我可以轻松做的是使用bsxfun 构造矩阵,例如
bsxfun(@(x, y) fun(x - y), Z(:, 1), x');
bsxfun(@(x, y) fun(x - y), Z(:, 2), y');
但是我需要通过将这两个矩阵的每一列按元素相乘来将它们组合成 3D 数组。
在第二步中,我需要创建一个大小为n x 3 x s x s 的数组,它从一侧看起来像下面的矩阵
[ones(n, 1), Z(:, 1) - x(i), Z(:, 2) - y(j);]
i=1,...s,j=1,...s。我可以用类似的东西循环两个额外的维度
A = [ones(n, 1), Z(:, 1) - x(1), Z(:, 2) - y(1)];
for i = 1:s
for j = 1:s
A(:, :, i, j) = [ones(n, 1), Z(:, 1) - x(i), Z(:, 2) - y(j);];
end
end
有没有办法避免循环?
在第三步中,假设在获得数组out1(从第一步输出)后,我想创建一个维度为n x n x s x s的新数组out3,其中包含主上的原始数组out1对角线,即out3(i,i,s,s) = out1(i, s, s) 和out3(i,j,s,s)=0 对于所有i~=j。是否有某种替代 diag 来创建“对角线数组”?或者,如果我创建 n x n x s x s 零数组,有没有办法将 out1 放在主对角线上?
【问题讨论】:
标签: matlab vectorization bsxfun