我有以下函数处理大写 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
得到:
这里 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