集成一个不直接操作元素的函数
早上好/下午/晚上,
我正在研究一个涉及四阶张量计算量积分的Matlab脚本。 设H(r,theta,phi)是我想要整合的函数。 假设H不能通过r,theta和phi的简单操作获得。
我的问题是,在Matlab中,就像我知道的任何其他代码一样:
All input functions must accept arrays and operate elementwise. The function FUN(X,Y,Z)
must accept arrays X, Y, Z of the same size and return an array of corresponding values.
这是从Matlab实现的integral3函数。
如果我尝试使用这个简单的功能:
fun = @(X,Y,Z) X.*Y.*Z
根本没有问题,如果我将它整合到[0,1] x [0,1] x [0,1]上,我会得到正确的结果:
integral3(fun,0,1,0,1,0,1)
返回0.125,这是正确的。
问题是,正如我所说的,我不能用矢量进行简单的计算来获得H,我不得不通过这种方式做或多或少的事情:
function [result] = fun(x,y,z)
    sz = length(x);
    result  = zeros(1,sz);
    for i=1:sz
        result(i) = x(i)*y(i)*z(i);
    end
end
这个函数独立工作,并返回与我之前介绍的另一个结果完全相同的结果。 但是,当我尝试使用integral3时出现此错误:
Error using integral2Calc>integral2t/tensor (line 241)
Integrand output size does not match the input size
但是从我的函数的定义中可以清楚地看出,我特意将其作为输入的大小。
我不明白什么是错的,我不确定我有任何其他解决方案来计算此功能比使用这种语法。
非常感谢您的时间和帮助:)
  你在正确的轨道上,但是你正在建立一个长度正确但大小错误的数组。  这是Matlab中的细微差别。  我猜测integral3正在传递一个列向量,但是你的函数总是返回一个行向量。  列和行向量具有相同的“长度” sz ,但具有不同的“大小”:列向量是[sz,1] ,行向量是[1,sz] 。  下面的代码做你想做的事情,因为它使用size来确保输出的所有维度匹配输入,并且numel各个元素: 
function result = fun(x,y,z)
    sz = size(x);
    result = zeros(sz);
    for i = 1:numel(x)
        result(i) = x(i)*y(i)*z(i);
    end
end
  一个好的经验法则是只使用size和numel , numel使用length ,这是Matlab中最差函数的竞争者。 
上一篇: Integrate a function that doesn't directly operate element
