【问题标题】:How to assign indexes to a function handle?如何将索引分配给函数句柄?
【发布时间】:2021-11-17 01:01:26
【问题描述】:

我试图近似函数“fun_1”和“fun_2”在给定区域上的积分。在单个“f”的情况下,它似乎没问题。但我想使用向量“f”而不是单个值来获得“TL”值向量。我不知道如何处理这个问题。代码是:

gamma = 1.4;
R = 286;
T = 273.15;
c_1 = sqrt(gamma*R*T);
c_2 = c_1
h = 0.00163;
rho_s = 2750;
M = 0;
m = rho_s*h;
eta = 0.01;
E = 72e9;
v = 0.30;
D = E*h^3/(12*(1-v^2));
f_c1 = c_1^2/(2*pi)*(m/D)^0.5;
f_c2 = c_2^2/(2*pi)*(m/D)^0.5;
n = 1500;
f = linspace(55,7700,n);
for i=1:numel(f)
    omega(i) = 2*pi*f(i);
    phi_2 = @(phi_1,beta) acos(c_2/c_1.*cos(phi_1).*(1+M.*cos(beta).*cos(phi_1)).^-1);
    tau = @(phi_1,beta) ((0.5*(rho_2*c_2/(rho_1*c_1))^0.5...
        +0.5*(rho_1*c_1/(rho_2*c_2))^0.5*sin(phi_2(phi_1,beta))./(sin(phi_1).*(1.0...
        +M*cos(beta).*cos(phi_1)))+0.5*eta*m*omega(i)*(rho_1*c_1*rho_2*c_2)...
        ^-0.5.*(f(i)/f_c2).^2.*sin(phi_1).*cos(phi_2(phi_1,beta)).^4).^2).^-1;
    fun_1 = @(phi_1,beta) tau(phi_1,beta).*sin(phi_1).*cos(phi_1);
    q_1(i) = integral2(fun_1,12*pi/180,90*pi/180,0,2*pi);
    fun_2 = @(phi_1,beta) sin(phi_1).*cos(phi_1);
    q_2 = integral2(fun_2,12*pi/180,90*pi/180,0,2*pi);
    tau_avg = q_1/q_2;
    TL = -10*log10(tau_avg);
end

【问题讨论】:

    标签: matlab indexing cell-array function-handle


    【解决方案1】:

    使用元胞数组。 TL{i}=-10*log10(tau_avg);

    【讨论】:

    • @MohammadSd:你没有问过要把tau变成一个数组,你为什么要索引到tau?请编辑您的问题并说明您想要做什么。
    • @CrisLuengo 谢谢。你的意思是我必须问“如何将函数句柄转换为数组?”那么答案是什么?
    • @AnderBiguri 谢谢。但问题在于“tau”本身。如果我使用 tau{i},则会出现如下错误:“无法执行赋值,因为这种类型的变量不支持大括号索引。”
    • @MohammadSd 我很困惑。 tau 不可索引。你想在哪里索引它?你能展示不工作的代码,而不是工作的代码吗?
    • @MohammadSd 我不知道。你的问题听起来像你有fun_1fun_2,但你想把它们放在一个数组中,比如fun{i}。那就是您需要单元阵列的地方。如果你想要“一个 TL 值的向量”,而 TL 当前是一个标量,那么是什么阻止你做 TL(i) = -10*log10(tau_avg);
    【解决方案2】:

    我从 MATLAB Answers 中的一位用户那里收到了这个答案,该答案对我有用并解决了我的问题。所以矢量化版本相比循环更高效。

    ...integral2 函数无法集成数组,尽管integral 能够。处理关于双重问题的方法 积分本质上是:

    f = randn(1, 25);
    fcn = @(x,y) sin(2*pi*f.*x) .* exp(0.1*f.*y);
    int2 = integral(@(y) integral(@(x) fcn(x,y), 0, 1, 'ArrayValued',1), -1, 0, 'ArrayValued',1);
    

    这会返回一个大小为 f 的向量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      • 2015-02-17
      • 2020-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多