我有一个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,但可以使它工作。 任何帮助将不胜感激。
答案 0 :(得分:3)
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)