【问题标题】:reshaping square matrix into Nx3 with no diagonal elements将方阵重塑为没有对角线元素的 Nx3
【发布时间】:2014-02-07 02:37:50
【问题描述】:

我有一个 NxN 相似矩阵,我需要将其重塑为 N*N-N x 3 矩阵。 我从对角线上删除了所有值。 我目前为此工作的代码:

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,但可以让它发挥作用。 任何帮助将不胜感激。

【问题讨论】:

  • 实际上在以某种方式询问后,我也弄清楚了。我也会发布它。它在 N>5000 时稍快(在我的机器上),但不如 chappjc 解决方案优雅: tmp = bsxfun(@times,1:N, one(N,1)); tmp = tmp(:); s = [tmp, repmat([1:N]',N,1), reshape(x',[],1)];

标签: matlab matrix vectorization reshape


【解决方案1】:

使用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)))]

【讨论】:

  • @oldflatop:没问题。如果您愿意,请随时投票并接受。 ;)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 2013-10-11
    • 2016-06-02
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多