集成一个不直接操作元素的函数

早上好/下午/晚上,

我正在研究一个涉及四阶张量计算量积分的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

一个好的经验法则是只使用sizenumelnumel使用length ,这是Matlab中最差函数的竞争者。

链接地址: http://www.djcxy.com/p/96503.html

上一篇: Integrate a function that doesn't directly operate element

下一篇: Kubernetes Pod fails with CrashLoopBackOff