Performance 在MATLAB中编写向量和

Performance 在MATLAB中编写向量和,performance,matlab,grid,interpolation,Performance,Matlab,Grid,Interpolation,假设我有一个函数,phi(x1,x2)=k1*x1+k2*x2,我在一个网格上对它进行了计算,其中网格是一个正方形,在x1和x2轴上都有-100和100的边界,具有一定的步长,比如h=0.1。现在,我想在我正在努力的网格上计算这个总和: 我想说的是: 全部清除 全部关闭 clc D=1;h=0.1; D1=-100; D2=100; X=D1:h:D2; Y=D1:h:D2; [x1,x2]=网格(X,Y); k1=2;k2=2; φ=k1.*x1+k2.*x2; 图(1) 冲浪(X,Y,ph

假设我有一个函数,
phi(x1,x2)=k1*x1+k2*x2
,我在一个网格上对它进行了计算,其中网格是一个正方形,在
x1
x2
轴上都有-100和100的边界,具有一定的步长,比如
h=0.1
。现在,我想在我正在努力的网格上计算这个总和:

我想说的是:

全部清除
全部关闭
clc
D=1;h=0.1;
D1=-100;
D2=100;
X=D1:h:D2;
Y=D1:h:D2;
[x1,x2]=网格(X,Y);
k1=2;k2=2;
φ=k1.*x1+k2.*x2;
图(1)
冲浪(X,Y,phi)
m1=-500:500;
m2=-500:500;
[M1,M2,X1,X2]=ndgrid(M1,M2,X,Y)
sys=@(m1,m2,X,Y)(k1*h*m1+k2*h*m2)。*exp(([X Y]-h*[m1-m2]).^2)。/(h^2*D)
sum1=总和(sys(M1,M2,X1,X2))
Matlab在
ndgrid
中说了错误,你知道我应该如何编码吗

MATLAB显示:

使用repmat时出现
错误
请求的10001x100x2001x2001(298649.5GB)阵列超出了最大阵列大小首选项。创建更大的数组
超过此限制可能需要很长时间,并导致MATLAB变得无响应。请参阅数组大小限制或首选项
有关更多信息,请参阅面板。
ndgrid中的错误(第72行)
varargout{i}=repmat(x,s);
新_try1中的错误(第16行)
[M1,M2,X1,X2]=ndgrid(M1,M2,X,Y)

从您的评论和代码判断,您似乎不完全理解等式要求您计算的内容

为了获得给定(x1,x2)下的值M(x1,x2),必须计算Z2上的和。当然,使用MATLAB等数值工具箱,您只能希望在Z2的某个有限范围内进行计算。在这种情况下,由于(x1,x2)覆盖范围[-100100]x[-100100],且h=0.1,因此mh覆盖范围[-10001000]x[-10001000]。示例:m=(-1000,-1000)表示mh=(-100,-100),这是域的左下角。所以实际上,φ(mh)就是在所有离散点上计算的φ(x1,x2)

另外,由于您需要计算
|x-hm | ^2
,因此可以将
x=x1+ix2
视为复数,以利用MATLAB的
abs
函数。如果严格使用向量,则必须使用
norm
,这也可以,但要详细一点。因此,对于某些给定的
x=(x10,x20)
,您将在整个离散平面上计算
x-hm
,作为
(x10-x1)+i(x20-x2)

最后,您可以一次计算一项M:

D=1; h=0.1;
D1 = -100;
D2 = 100;
X = (D1 : h : D2); % X is in rows (dim 2)
Y = (D1 : h : D2)'; % Y is in columns (dim 1)
k1=2;k2=2;
phi = k1*X + k2*Y;

M = zeros(length(Y), length(X));

for j = 1:length(X)
    for i = 1:length(Y)
        % treat (x - hm) as a complex number
        x_hm = (X(j)-X) + 1i*(Y(i)-Y); % this computes x-hm for all m
        M(i,j) = 1/(pi*D) * sum(sum(phi .* exp(-abs(x_hm).^2/(h^2*D)), 1), 2);
    end
end

顺便说一下,这个计算需要相当长的时间。你可以考虑增加<代码> h <代码>,减少<代码> d1 和<代码> d2>代码>,或者改变所有三个。

根据你的评论和代码判断,你似乎不完全理解这个等式要求你计算什么。

为了获得给定(x1,x2)下的值M(x1,x2),必须计算Z2上的和。当然,使用MATLAB等数值工具箱,您只能希望在Z2的某个有限范围内进行计算。在这种情况下,由于(x1,x2)覆盖范围[-100100]x[-100100],且h=0.1,因此mh覆盖范围[-10001000]x[-10001000]。示例:m=(-1000,-1000)表示mh=(-100,-100),这是域的左下角。所以实际上,φ(mh)就是在所有离散点上计算的φ(x1,x2)

另外,由于您需要计算
|x-hm | ^2
,因此可以将
x=x1+ix2
视为复数,以利用MATLAB的
abs
函数。如果严格使用向量,则必须使用
norm
,这也可以,但要详细一点。因此,对于某些给定的
x=(x10,x20)
,您将在整个离散平面上计算
x-hm
,作为
(x10-x1)+i(x20-x2)

最后,您可以一次计算一项M:

D=1; h=0.1;
D1 = -100;
D2 = 100;
X = (D1 : h : D2); % X is in rows (dim 2)
Y = (D1 : h : D2)'; % Y is in columns (dim 1)
k1=2;k2=2;
phi = k1*X + k2*Y;

M = zeros(length(Y), length(X));

for j = 1:length(X)
    for i = 1:length(Y)
        % treat (x - hm) as a complex number
        x_hm = (X(j)-X) + 1i*(Y(i)-Y); % this computes x-hm for all m
        M(i,j) = 1/(pi*D) * sum(sum(phi .* exp(-abs(x_hm).^2/(h^2*D)), 1), 2);
    end
end

顺便说一下,这个计算需要相当长的时间。您可以考虑增加<代码> h <代码>,减少<代码> d1 和<代码> d2>代码>,或者更改所有三个。

错误消息不完整,请粘贴完整的错误信息。错误说明您将退出RAM(显然您的可用性小于29 891.8GB)。这是由于您要进行的矩阵计算顺便说一句,请下次把你的代码组织得更好将其剥离到基本零件。您在这里使用的是
syms
?看起来问题中的一切都是数字而不是符号。。。这发生在您的错误之后,但它表明您的方法没有得到很好的定义。试着在你的问题中加入一个,强调最小值,比如一个更小的输入网格,在那里你可以用手工计算显示预期的输出,这样我们就可以验证任何建议的解决方案!你有一个无限和
m∈ (-inf,inf)
,因为积分是和的极限,所以可以积分函数
M
,类似于
integral(M*dm)
(变量
M
从-inf到inf的积分)。获得结果后,现在可以计算每个
x1
x2
的值。错误消息仍然不完整。请更新您的问题并包含完整的错误消息!该错误消息不完整,请粘贴完整的错误消息。错误表明您的RAM不足(显然可用内存不足29891.8GB;)。这是由于您要进行的矩阵计算顺便说一句,请下次把你的代码组织得更好将其剥离到基本零件。您在这里使用的是
syms
?看起来问题中的一切都是数字而不是符号。。。这发生在您的错误之后,但它表明您的方法没有得到很好的定义。试着在你的问题中加入一个,强调最小值,比如一个更小的输入网格,在那里你可以用手工计算显示预期的输出,这样我们就可以验证任何建议的解决方案!你有一个无限和
m∈ (