我在 matlab 中创建了一个函数,它返回一个像
function w = W_1D(x,pos,h)
w=zeros(1,length(x));
if (h~=0)
xmpos = x-pos;
inds1 = (-h <= xmpos) & (xmpos < 0);
w(inds1) = xmpos(inds1)./h + 1;
inds2 = (0 <= xmpos) & (xmpos <= h);
w(inds2) = -xmpos(inds2)./h + 1;
else
error('h shouldn't be 0')
end
end
因此,最终,有一个大小为 length(x)
的向量w
。现在我创建了第二个函数,例如
function f = W_2D(x,y,pos_1,pos_2,h)
w_x = W_1D(x,pos_1,h);
w_y = W_1D(y,pos_2,h);
f = w_x'*w_y;
end
哪里length(x)=length(y)
.因此,该函数显然W_2D
返回一个矩阵。但是当我现在尝试在矩形域上评估积分时,例如
V = integral2(@(x,y) W_2D(x,y,2,3,h),0,10,0,10);
Matlab 返回一些错误:
Error using integral2Calc>integral2t/tensor (line 242)
Integrand output size does not match the input size.
Error in integral2Calc>integral2t (line 56)
[Qsub,esub] = tensor(thetaL,thetaR,phiB,phiT);
Error in integral2Calc (line 10)
[q,errbnd] = integral2t(fun,xmin,xmax,ymin,ymax,optionstruct);
Error in integral2 (line 107)
Q = integral2Calc(fun,xmin,xmax,yminfun,ymaxfun,opstruct);
我还尝试更改W_2D
函数中的某些内容:而不是f = w_x'*w_y;
我试过f = w_x.'*w_y;
或w_y = transpose(w_y); f = kron(w_x,w_y);
,但积分输出大小总是存在此错误。谁能解释一下,我的错在哪里?
编辑:在Werner使用键盘调试方法的提示之后,我可以告诉您以下内容。第一步返回类型 <1x154 double>
的 w_x
,w_y
<1x192 double>
,x
和 y
都是<14x14 double>
。在下一步中,将显示值为 <154x192 double>
的 f
。然后一切都消失了,除了x
和y
,matlab-function integral2Calc.m 出现在编辑器中,它跳转到函数调用堆栈integral2t/tensor
,经过更多步骤,错误发生在这里
Z = FUN(X,Y); NFE = NFE + 1;
if FIRSTFUNEVAL
if ~isfloat(Z)
error(message('MATLAB:integral2:UnsupportedClass',class(Z)));
end
% Check that FUN is properly vectorized. This is important here
% because we (otherwise) always pass in square matrices, which
% reduces the probability of the user generating an error by
% using matrix functions instead of elementwise functions.
Z1 = FUN(X(VTSTIDX),Y(VTSTIDX)); NFE = NFE + 1;
if ~isequal(size(Z),size(X)) || ~isequal(size(Z1),size(VTSTIDX))
% Example:
% integral2(@(x,y)1,0,1,0,1)
error(message('MATLAB:integral2:funSizeMismatch'));
end
希望信息足够详细...我不知道会发生什么,因为我的例子与mathworks网站上给出的关于integral2
一样精确,不是吗?
也许我应该更精确一点,我想做什么:由于W_2D给了我一个紧凑支持的二维帽子函数的表面w(x,y),存储在矩阵w
中,我想计算(x,y)平面和表面z=w(x,y)之间的体积...
EDIT2:我仍然不明白如何处理这个问题,integral2
创建矩阵作为我的W_1D
函数的输入,这些矩阵在W_2D
中调用,旨在具有<1xn double>
值输入并返回<1xn double>
输出,但至少我可以简单地使用以下方法通过使用两个一维integral
调用来解决张量积上的积分, 那是
V = integral(@(x)integral(@(y)W_1D(y,3,h),0,10).*W_1D(x,2,h),0,10);
第一个函数是完全错误的。当您在内部执行w = x
时,您没有索引数组位置。
此外,如果这行得通,您将返回一个线向量,即大小1xlength(x)
,当您执行w_x'*时w_y您正在执行length(x)x1
倍1xlength(y)
,这将为您提供矩阵length(x)*length(y)
。
考虑更正函数:
function w = W_1D(x,pos)
w = zeros(length(x),1); % Allocate w as column vector, so that the product gives a scalar (as I suppose that it is what you want.
for ii=1:length(x) % Here, so that is indexes w and x elements as you need
w(ii)=x(ii) - pos; % I changed your code to something that makes sense, but I don't know if that is what you want to do, you have to adapt it to work correctly.
end
end
您可能还想调试函数,考虑在操作之前添加keyboard
,并使用 dbstep
检查它们返回的内容。即:
function f = W_2D(x,y,pos_1,pos_2)
w_x = W_1D(x,pos_1);
w_y = W_1D(y,pos_2);
keyboard
f = w_x'*w_y;
end
执行将在 keyboard
停止,然后您可以检查w_x
大小、w_y
大小,并执行dbstep
以跟踪f = w_x'*w_y
并查看它返回的内容。完成调试后,您可以执行dbcont
以便它继续执行。
这个答案是一个草稿,因为很难帮助你提供你提供的信息。但我认为你可以开始解决这个问题。如果您还有其他疑问,请随时询问。