Написание цикла, который работает для любого значения N - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть код для одномерного уравнения теплопроводности.Я пытаюсь отформатировать цикл for так, чтобы матрица A следовала определенному шаблону 1 -2 1 по всей диагонали матрицы, которая могла бы быть бесконечной.Паттерн начинает обретать форму, когда я возиться с инициализированным счетчиком в начале цикла for, но это меняет размер матрицы, что не соответствует остальной части кода.

Мой текущий код указан ниже.A * * * * * * * * * * * * * * * * * - это то, что должно быть.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Существует множество простых способов создания этой матрицы.

  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. Прямое индексирование диагональных и недиагональных элементов.Диагональные элементы для матрицы N x 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;
    
  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];
    
0 голосов
/ 13 февраля 2019

В 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...