如果等于1则更改对角线值

时间:2019-03-20 19:40:22

标签: matlab

如果等于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 个答案:

答案 0 :(得分:4)

函数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

答案 1 :(得分:3)

这是仅使用线性索引的解决方案。我想避免生成其他矩阵。 Cris Luengo's answer没什么错,那只是为了好玩。

% 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