编写一个适用于N的任何值的循环

时间:2019-02-13 05:03:19

标签: matlab for-loop matrix

我有一个一维热方程的代码。我试图格式化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;

2 个答案:

答案 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)

创建此矩阵的方法很简单。

  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}查找}您要处理的该行的三个索引。

  2. 直接索引对角线元素和非对角线元素。 row-1:row+1 x N矩阵的对角元素为N。显然这要复杂得多,我更喜欢循环:

    1:N+1:end
  3. 使用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