Matlab:从矩阵中删除对角线并重新组合

6
我想移除以下矩阵的对角线:
 [0 1 1
  0 0 0
  0 1 0]

把这个放入一个向量中,如下所示:
[1 1 0 0 0 1]

是否有一种单向函数可以实现这个功能?我在 Stack Overflow 上找到的大多数解决方案都会删除所有零。


它是否总是一个方阵,还是维度可以不同? - Dennis Klopfer
2个回答

7
如果两条线是好的...
x = x.'; %'// transpose because you want to work along 2nd dimension first
result = x(~eye(size(x))).'; %'// index with logical mask to remove diagonal

就是这么简单!非常感谢! - Jill
为什么要转置?我可以通过测试看到它有效,但是~eye好像在原始的x上生成了一个掩码。第二行代码是否使用列主序中的线性索引? - Adriaan
2
第一个转置是因为 OP 想要按行主序返回结果,但是使用 ~eye(size(x)) 索引会返回列主序。第二个转置是因为 OP 想要一个行向量,而逻辑掩码返回的是列向量。 - IKavanagh

1
这是一个几乎只有一行的代码:
[m,n] =  size(x);
x(setdiff(reshape(reshape(1:numel(x),m,n).',1,[]),1:m+1:numel(x),'stable'))

我会在这里放上我最喜欢的favbsxfun -

xt = x.';    %//'
[m,n] =  size(x);
out = xt(bsxfun(@ne,(1:n)',1:m)).'

样例运行 -

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

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