在 MATLAB 中填充函数句柄“数组”

问题描述 投票:0回答:1

我有以下函数处理大写 K 和小写 k 和 gamma 值的数组。

N = 3;
k = randi([1,1000],N+1,1,"double");
gamma =  randi([1,100],N+1,1,"double");

K = @(x) [zeros(N,N)];

我需要用小写 k 和 x 的特定值填充此函数句柄。对于 N=3 的示例,相应的大写 K 矩阵为:

看这个大写的 K 矩阵,我们可以看到模式是从矩阵中绿色的前两个元素开始,复制它们的值,将它们右移一次,下移一次,然后增加每个元素的索引元素中的变量增加 1。

我想使用以下函数返回大写的 K:

function K = karray (k,N)
    K = @(x) [zeros(N,N)];
    for i=1:1:N
        for j=1:1:N
            K(i,j) = (k(i)*gamma(i)+k(i+1)*gamma(i+1))*x(i)^2+k(i)+k(i+1);
            K(i,j+1) = -3*k(i+1)*gamma(i+1)*x(i)^2-k(i+1);
        end
    end
end

我最初的想法是使用嵌套的 for 循环来填充大写的 K,但由于 K 是一个函数句柄,我不能简单地使用

K(i,j)
访问 K 中的每个元素。我认为我填充 K 的方法是正确的,但我不确定如何正确访问 K 中的每个元素。

编辑: 如何从大写 K 矩阵中删除第

N
伽马和 k 项?例如,对于
N=4
,如何删除
k_4
gamma_4
得到: enter image description here

arrays algorithm matlab nested-loops function-handle
1个回答
3
投票

这里 spdiags 用于创建对角矩阵。否则,您可以使用 for 循环来填充对角矩阵。

function K = karray(k, gamma, N)
    K = @(x) make_diagonal(x, k, gamma, N);
end

function out = make_diagonal(x, k, gamma, N)
    x = x(:);
    x = [x(1:N); 0];

    ck = circshift(k, -1);
    cg = circshift(gamma, -1);
    cx = circshift(x, -1);
    ccx =circshift(x, 1);

    d1 = -3 .* ck .* cg .* cx .^ 2 - ck;
    d2 = (k .* gamma + ck .* cg) .* x .^ 2 + k + ck;
    d3 = -3 .* k .* ccx .^ 2 - k;

    out = full(spdiags([d1 d2 d3], -1:1, N, N));
end
© www.soinside.com 2019 - 2024. All rights reserved.