如何在MATLAB中删除矩阵的对角元素?

5
我需要一个代码来省略矩阵的对角元素 例如如果
A =

[1 2 3;
 1 2 3;
 1 2 3];

输出结果如下:
[2 3;
 1 3;
 1 2];

我该如何简单地实现它(我知道有一个冗长的方法,但我需要简单易懂的方式)。

3个回答

5
这里有一个解决方案:
Alower = tril(A, -1);
Aupper = triu(A,  1);
result = Alower(:, 1:end-1) + Aupper(:, 2:end)

演示:

> A = [1 2 3; 1 2 3; 1 2 3]
A =

   1   2   3
   1   2   3
   1   2   3

> tril(A, -1)(1:end, 1:end-1) + triu(A, 1)(1:end, 2:end)
ans =

   2   3
   1   3
   1   2

它没有起作用,它给了我这个错误:??? 错误:() 索引必须出现在索引表达式的最后。 - Mohamad Pishdad
哇,我对它进行了一些更改,然后它就起作用了......谢谢你的帮助,这非常聪明。 - Mohamad Pishdad
@aioobe:+1 我之前也用过类似的技巧 :) 请注意,您可以只写 : 而不是 1:end。此外,演示中的语法仅适用于 Octave(在 MATLAB 中不支持直接索引结果)。 - Amro
@Amro,好!啊,对了,老是忘记这些语法上的捷径……我目前只在Stack Overflow上使用Matlab :) - aioobe

3
请注意,在消除nn矩阵的对角线后,有两种可能性:
  1. If the aftermath matrix is n by n-1 (like in your question), you can do it by:

    A=A';
    A(1:n+1:n*n)=[];
    A=reshape(A,n-1,n)';
    
  2. If the aftermath matrix is n-1 by n, you can do it like this:

    A(1:n+1:n*n)=[];
    A=reshape(A,n-1,n);
    

这几乎是完美的,但它返回的是行向量而不是数组。 - High Performance Mark

0
这是另一种方法。
reshape(A(setdiff(1:9,1:4:9)),[3,2])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接