Изменение диагональных значений, если оно равно 1 - PullRequest
0 голосов
/ 20 марта 2019

Я хочу изменить диагональные значения, если они равны 1. Можно ли искать диагонали и изменять значения в этой конкретной диагонали на другое значение.

Например:

X =

     1     1     1     0
     1     1     0     1
     1     0     1     1
     0     1     1     1 

Я хочу изменить эту диагональ:

    1
    0
    1

на

    2.2
    0
    2.2

Я пытался:

XX(logical(eye(size(XX)))) = 2

, но это изменит все значения, а не только.

Не могли бы вы объяснить, как это сделать для других диагоналей?

Ответы [ 2 ]

4 голосов
/ 20 марта 2019

Функция diag полезна для работы с диагоналями. Он только извлекает диагональ из матрицы или формирует новую матрицу с учетом вектора диагональных элементов. Но с соответствующей арифметикой этого достаточно:

X = [1 1 1 0
     1 1 0 1
     1 0 1 1
     0 1 1 1];

k = 2;         % which diagonal to change
d = diag(X,k); % the old diagonal
n = d;
n(n==1) = 2.2; % the new diagonal values
X = X - diag(d,k) + diag(n,k); % subtract old values from diagonal, add new ones

Выход:

X =

   1.00000   1.00000   2.20000   0.00000
   1.00000   1.00000   0.00000   2.20000
   1.00000   0.00000   1.00000   1.00000
   0.00000   1.00000   1.00000   1.00000
3 голосов
/ 20 марта 2019

Здесь приходит решение только с использованием линейной индексации. Я хотел избежать генерации дополнительных матриц. Нет ничего плохого в ответе Крис Луенго , это было просто для удовольствия.

% Input.
X = [1 1 1 0
     1 1 0 1
     1 0 1 1
     0 1 1 1]

% Which diagonal to change.
k = 2;

% Determine dimension.
dim = size(X, 1);

% Calculate indices of diagonal elements.
idx = (max(abs(k), k * dim) + 1):(dim + 1):numel(X);
idx = idx(1:end+min(k+1, 0));

% Replace diagonal elements with new value.
X(idx(X(idx) == 1)) = 2.2

Выход:

X =

   1.00000   1.00000   2.20000   0.00000
   1.00000   1.00000   0.00000   2.20000
   1.00000   0.00000   1.00000   1.00000
   0.00000   1.00000   1.00000   1.00000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...