我有一个一维热方程的代码。我试图格式化for
循环,以使A
矩阵沿矩阵的整个对角线遵循1 -2 1
的特定模式,该模式可能是无限的。当我在for
循环开始时弄乱了初始化计数时,该模式就开始成形,但这会改变矩阵的大小,从而使其余代码失效。
我当前的代码如下。已注释的A
矩阵编辑就是应该的。
N = 5;
%A(2,1:3) = [1 -2 1];
%A(3,2:4) = [1 -2 1];
%A(4,3:5) = [1 -2 1];
%A(5,4:6) = [1 -2 1];
A = zeros(N+1,N+1);
A(1,1) = 1;
for count=N:N+1
A(count+1,count:count+2) = [1 -2 1];
end
A(N+1,N+1) = 1;
答案 0 :(得分:2)
在Matlab中,您通常可以避免循环。在这种情况下,您可以通过2D卷积获得所需的结果:
>> N = 6;
>> A = [1 zeros(1,N-1); conv2(eye(N-2), [1 -2 1]); zeros(1,N-1) 1]
A =
1 0 0 0 0 0
1 -2 1 0 0 0
0 1 -2 1 0 0
0 0 1 -2 1 0
0 0 0 1 -2 1
0 0 0 0 0 1
或者,根据您的需要,
>> A = conv2(eye(N), [1 -2 1], 'same')
A =
-2 1 0 0 0 0
1 -2 1 0 0 0
0 1 -2 1 0 0
0 0 1 -2 1 0
0 0 0 1 -2 1
0 0 0 0 1 -2
答案 1 :(得分:1)
创建此矩阵的方法很简单。
您的循环可以进行如下修改:
N = 5;
A = zeros(N+1,N+1);
A(1,1) = 1;
for row = 2:N
A(row, row-1:row+1) = [1 -2 1];
end
A(N+1,N+1) = 1;
我已将count
重命名为row
,我们正在为每一行建立索引(从2到N
,跳过第一行和最后一行),然后使用{{1}查找}您要处理的该行的三个索引。
直接索引对角线元素和非对角线元素。 row-1:row+1
x N
矩阵的对角元素为N
。显然这要复杂得多,我更喜欢循环:
1:N+1:end
使用N = 6;
A = zeros(N,N);
A(1:N+1:end) = -2;
A(2:N+1:end-2*N) = 1; % skip last row
A(2*N+2:N+1:end) = 1; % skip first row
A(1,1) = 1;
A(N,N) = 1;
。我们需要对第一行和最后一行进行特殊处理:
diag