代码之家  ›  专栏  ›  技术社区  ›  Jonathan Frutschy

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

  •  0
  • Jonathan Frutschy  · 技术社区  · 2 年前

    我有以下函数来处理大写的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矩阵是: enter image description here

    看看这个大写的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中的每个元素。

    编辑: 如何移除 N+1 th伽玛和k项?例如,对于 N=3 ,如何删除 k_4 gamma_4 得到: enter image description here

    0 回复  |  直到 1 年前
        1
  •  4
  •   Jonathan Frutschy    1 年前

    在这里 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
    

    编辑: 在回答编辑后的问题时 你如何删除 k_4 gamma_4 ? 你需要设置 ck(end) = 0; cg(end) = 0; 计算之前 d1 , d2 d3 .