将方阵重新整形为Nx3,没有对角线元素

时间:2014-01-17 16:52:16

标签: matlab matrix vectorization reshape

我有一个NxN相似度矩阵,我需要通过3矩阵重塑成N * N-N。 我从对角线中删除所有值。 我目前为此工作的代码:

N=3;x=magic(N);
M=N*N-N;s=zeros(M,3);
j=1;
for i=1:N
 for k=[1:i-1,i+1:N]
 s(j,1)=i;
 s(j,2)=k;
 s(j,3)=x(i,k);
 j=j+1;
 end;
end;

因此,对于此示例,矩阵s为:

1   2   1
1   3   6
2   1   3
2   3   7
3   1   4
3   2   9

我想避免使用for循环,因为我的矩阵相当大。我一直在努力重塑和bsxfun,但可以使它工作。 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

使用eyefind的一种可能性:

N = 3; x = magic(N);
M = N*N-N;
s = zeros(M,3);
[s(:,2),s(:,1),s(:,3)] = find(~eye(N).*x.');

或者,使用ndgrid

[ii,jj] = ndgrid(1:size(x,1),1:size(x,2));
m = ii~=jj;
s = [jj(m) ii(m) x(sub2ind(size(x),jj(m),ii(m)))]

答案 1 :(得分:0)

您可以通过使用逻辑索引来加快chappjc对大N的回答,但您必须分别生成s(:,2)和s(:,1):

N=3;x=magic(N);
x=x'
s(:,3) = reshape(x(~logical(eye(N))),[],1)