【问题标题】:Writing a loop that works for any value of N编写一个适用于任何 N 值的循环
【发布时间】:2019-02-13 05:03:19
【问题描述】:

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

【问题讨论】:

  • 我不明白为什么,k= 0.2;。您还可以简化 qustion 并添加 cmets 来告诉 YOU 想要在特定行中做什么?可能是,给你预期的输出。现在这个程序的输出是什么?此外,x 将是一个 6 元素数组。 A 将是 6X6 但 for 循环尝试访问类似 A(7,8) 的内容。为什么?

标签: matlab for-loop matrix


【解决方案1】:

在 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

【讨论】:

    【解决方案2】:

    创建这个矩阵有很多简单的方法。

    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,跳过第一行和最后一行),然后使用 row-1:row+1 查找该行的三个索引你想解决的问题。

    2. 直接索引对角线和非对角线元素。 NxN 矩阵的对角元素是 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;
      
    3. 使用diag。我们需要对第一行和最后一行进行特殊处理:

      N = 6;
      A = diag(-2*ones(N,1),0) + diag(ones(N-1,1),1) + diag(ones(N-1,1),-1);
      A(1,1:2) = [1,0];
      A(end,end-1:end) = [0,1];
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      • 2019-06-21
      • 2022-09-28
      • 1970-01-01
      • 2016-10-17
      相关资源
      最近更新 更多