在matlab中使用元素加法向矩阵的对角线添加值

bie*_*man 3 arrays matlab matrix

我正在编写一个对矩阵进行操作的脚本,我遇到了需要将前一个矩阵的对角线总和添加到新矩阵的对角元素的问题.到目前为止,我对这个特定功能的代码(下面将详细介绍)是:

t = 1;
for k = (m-1):-1:-(m-1)
    C = bsxfun(@plus, diag(B, k), d);
    g(t) = sum(diag(B, k));
    t = t + 1;
end
Run Code Online (Sandbox Code Playgroud)

其中d是1x3阵列,C应该是3x3阵列; 然而,C被输出为1x3阵列,使得第一对角线被求和并加到d,然后将主对角线求和并加到d,最后的对角线被求和并加到d.

有没有办法可以得到C的值,使得第一个对角线是它添加到d的最后一个元素的各个元素的总和,主对角线的各个元素添加到d的中间元素,以及底部对角线的元素添加到d的第一个元素?(虽然仍然适用于任何数组大小?)

这是一张描述我想要实现的目标的图片:

向对角线添加总和

谢谢!

Lui*_*ndo 5

您可以使用toeplitz生成包含需要添加到原始矩阵的值的矩阵:

M = [5 5 5; 7 7 7; 9 9 9]; %// data matrix
v = [1 11 4 3 2]; %// data vector
S = toeplitz(v);
S = S(1:(numel(v)+1)/2, (numel(v)+1)/2:end);
result = M+S;
Run Code Online (Sandbox Code Playgroud)

或者,如@thewaywewalk所述,您可以更直接地执行以下操作:

M = [5 5 5; 7 7 7; 9 9 9]; %// data matrix
v = [1 11 4 3 2]; %// data vector
result = M + toeplitz(v(size(M,1):-1:1), v(size(M,2):end));
Run Code Online (Sandbox Code Playgroud)