matlab中integral2的正确函数句柄

matlab中integral2的正确函数句柄,matlab,function,integral,Matlab,Function,Integral,我在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 <=

我在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
其中
长度(x)=长度(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=转置(w_y);f=克朗(w_x,w_y),但被积函数输出大小的内容总是存在此错误。
谁能解释一下,我的错在哪里

编辑:在沃纳用键盘调试方法提示之后,我可以告诉你以下内容。 第一步返回
类型的
w\u x
w\u y
x
y
都是
。在下一步中,
f
出现,其值为
。然后所有的东西都消失了,除了
x
y
和编辑器中出现的matlab函数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
中调用,目的是具有
值的输入并返回
输出,但至少我可以简单地使用下面的方法,通过使用两个一维的
积分
-调用,来求解张量积上的积分,也就是

V = integral(@(x)integral(@(y)W_1D(y,3,h),0,10).*W_1D(x,2,h),0,10);

第一个函数是完全错误的。在为执行
w=x
内部操作时,您没有索引数组位置

此外,如果这样做有效,您将返回一个线向量,即size
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

您可能还想调试您的函数,在操作之前考虑添加<代码>键盘< /代码>,并使用<代码> dBSTEP/COD>检查它们返回的内容。即:

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
执行将在
键盘
处停止,然后您可以检查
w_x
大小,
w_y
大小,并执行
dbstep
以跟踪
f=w_x'*w_y
并查看返回的内容。完成调试后,可以执行
dbcont
,以便继续执行


这个答案是草稿,因为你提供的信息很难帮助你。但我想你可以用这个解决问题。如果您有更多疑问,请随时提问。

第一个函数完全错误。在为执行
w=x
内部操作时,您没有索引数组位置

此外,如果这样做有效,您将返回一个线向量,即size
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

您可能还想调试您的函数,在操作之前考虑添加<代码>键盘< /代码>,并使用<代码> dBSTEP/COD>检查它们返回的内容。即:

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
执行将在
键盘
处停止,然后您可以检查
w_x
大小,
w_y
大小,并执行
dbstep
以跟踪
f=w_x'*w_y
并查看返回的内容。完成调试后,可以执行
dbcont
,以便继续执行


这个答案是草稿,因为你提供的信息很难帮助你。但我想你可以用这个解决问题。如果您有更多疑问,请随时提问。

非常抱歉,但我认为尽可能缩短示例函数会更好,并且没有意识到这一重大错误。现在有了我正在使用的实际函数。@Mr.Kitopa这一matlab行给你一个应该发生什么的提示:
if~isequal(size(Z),size(X))| | ~isequal(size(Z1),size(VTSTIDX))
。看起来,函数应该返回一个
14x14
矩阵,即Z(如果我是对的,它是函数返回的矩阵)应该与X和Y输入具有相同的大小。因此,在计算
w
时,您应该小心,这样您可以为函数中的每个
x
y
输入一个值。您能再解释一下吗?我不知道,当我想从两个输入向量得到一个输出矩阵时,我怎么能得到一个返回两个值的函数。这意味着,例如,对于x(i)和y(j)对,应该有一个值w(i,j)。我可以用两个for循环来实现这一点,但我认为,张量积正好做到了这一点,而且速度更快(因为矢量化)……或者我是Worn?@Kitopa先生,正如你自己所说,x和y都是,输入不是矢量,它们是所有网格点的矩阵,它将用来估计积分。我认为你的函数应该做的是返回一个表示这个网格函数答案的矩阵,但是你返回的是一个矩阵。因此,您需要使用这两个函数,以便它使用输入的14x14网格点,以返回具有相同大小且有意义的答案网格(有意义的意思是,该函数表示它所显示的值)