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

w6lpcovy  于 2023-10-23  发布在  Matlab
关注(0)|答案(1)|浏览(190)

我有下面的函数来处理Rankk和Rankk和gamma值的数组。

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

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

我需要用特定的值来填充这个函数句柄。对于N=3的这个例子,对应的矩阵为:

观察这个矩阵,可以看到模式是从矩阵中的前两个元素(绿色)开始,复制它们的值,向右移动一次,向下移动一次,然后将元素中每个变量的索引增加1。
我想用下面的函数来返回RISK:

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循环来填充KNOK,但由于K是一个函数句柄,我不能简单地使用K(i,j)访问K中的每个元素。我认为我填充K的方法是正确的,但我不确定如何正确访问K中的每个元素。

u91tlkcl

u91tlkcl1#

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

相关问题