Matlab:从矩阵中删除对角线并进行改革

Matlab:从矩阵中删除对角线并进行改革,matlab,matrix,diagonal,Matlab,Matrix,Diagonal,我想删除下列矩阵的对角线 [0 1 1 0 0 0 0 1 0] 把它放在一个向量中 [1 1 0 0 0 1] 是否有一个单向函数来执行此操作? 我在堆栈溢出上找到的大多数其他解决方案都会删除所有零。如果两行都很好 x = x.'; %'// transpose because you want to work along 2nd dimension first result = x(~eye(size(x))).'; %'// index with logical mask t

我想删除下列矩阵的对角线

 [0 1 1
  0 0 0
  0 1 0]
把它放在一个向量中

[1 1 0 0 0 1]
是否有一个单向函数来执行此操作?
我在堆栈溢出上找到的大多数其他解决方案都会删除所有零。

如果两行都很好

x = x.'; %'// transpose because you want to work along 2nd dimension first
result = x(~eye(size(x))).'; %'// index with logical mask to remove diagonal

这是一条几乎只有一条的班轮-

[m,n] =  size(x);
x(setdiff(reshape(reshape(1:numel(x),m,n).',1,[]),1:m+1:numel(x),'stable'))
我会把我的最爱放在这里-

样本运行-

>> x
x =
    52    62    37    88
    23    68    98    91
    49    40     4    79
>> [m,n] =  size(x);
>> x(setdiff(reshape(reshape(1:numel(x),m,n).',1,[]),1:m+1:numel(x),'stable'))
ans =
    62    37    88    23    98    91    49    40    79
>> xt = x.';
>> xt(bsxfun(@ne,(1:n)',1:m)).'
ans =
    62    37    88    23    98    91    49    40    79

它总是一个正方形矩阵,还是尺寸可以不同?就这么简单!非常感谢你!为什么要换位?我可以通过测试看出它是有效的,但就我所能看到的,
~eye
在原始的
x
上做了一个遮罩。第二行代码是否使用列主顺序的线性索引?第一个转置是因为OP希望结果返回行主,但使用
~eye(size(x))
索引返回列主。第二种转置是因为OP需要一个行向量,而不是逻辑掩码返回的列向量。
>> x
x =
    52    62    37    88
    23    68    98    91
    49    40     4    79
>> [m,n] =  size(x);
>> x(setdiff(reshape(reshape(1:numel(x),m,n).',1,[]),1:m+1:numel(x),'stable'))
ans =
    62    37    88    23    98    91    49    40    79
>> xt = x.';
>> xt(bsxfun(@ne,(1:n)',1:m)).'
ans =
    62    37    88    23    98    91    49    40    79