2

我正在尝试在三维域中构建以下函数。

在此处输入图像描述

其中在此处输入图像描述是常数向量,在此处输入图像描述是位置向量,在此处输入图像描述是常数,在此处输入图像描述是时间。

在此处输入图像描述是一个大小为 的向量,是一个大小[1 3]为3 维域中的点的在此处输入图像描述数组,是一个常数,是一个大小为 的数组。[NX*NY*NZ 3]在此处输入图像描述在此处输入图像描述[1 NT]

以下是问题的设置。

dx = 0.1;
dy = 0.5;
dz = 0.1;

[x, y, z] = meshgrid( (1:100)*dx, (1:100)*dy, (1:100)*dz );
X = [x(:) y(:) z(:)];

k = [1 2 3];
c = 0.5;    
t = 0:0.1:1;

事实上,下面的循环可以工作,但速度很慢(~200秒)。

f = zeros(numel(X)/3, numel(t));
for n = 1:numel(t)
    for i = 1:numel(X)/3
        f(i, n) = tan(dot(k, X(i,:)+c*t(n)));
    end
end

我考虑过使用和arrayfun重复使用向量并在第二维中点它,但我不知道我应该为and的乘法做些什么。krepmatXct

什么是为所有点和所有时间定义函数的有效方法?例如,此函数的输出看起来像一个 size 数组[NX*NY*NZ NT]

4

2 回答 2

2

bsxfun approach to speedup f calculation -

t1 = bsxfun(@plus,X,permute(c*t,[1 3 2]));
t2 = permute(k(ones(numel(t),1),:),[3 2 1]);
t3 = bsxfun(@times,t1,t2);
f = tan(squeeze(sum(t3,2)));

Or a slight variant -

t1 = bsxfun(@plus,X,permute(c*t,[1 3 2]));
t3 = bsxfun(@times,t1,k);
f = tan(squeeze(sum(t3,2)));
于 2014-06-03T21:27:59.033 回答
2
f = tan(sum(bsxfun(@times, permute(k, [1 3 2]), bsxfun(@plus, permute(X, [1 3 2]), c*t)), 3));

或者用矩阵乘法替换外部bsxfun。这似乎稍微快一点:

f = tan(reshape(reshape(bsxfun(@plus, permute(X, [1 3 2]), c*t), [], 3) * k(:), [size(X,1) numel(t)]));
于 2014-06-03T21:31:35.523 回答