集成一个不直接操作元素的函数
早上好/下午/晚上,
我正在研究一个涉及四阶张量计算量积分的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