如果等于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
但是这不仅会更改所有值。
您能解释一下其他对角线的设置方法吗?
答案 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