矢量化代码将矢量转换为矩阵

时间:2017-12-07 17:20:52

标签: matlab matrix vector vectorization

我在MATLAB中有一个维度A的向量Nx1,例如

N = 5;
A = [1
     2
     3
     4
     5];

我想构建一个维度为B的矩阵(N-1) x N,以便: 对于i=1,...,NB(:,i)包含1,2,...,i-1,i+1,...,N的行A

在上面的例子中,

B = [2 1 1 1 1
     3 3 2 2 2
     4 4 4 3 3
     5 5 5 5 4]

这段代码符合我的要求:

 B=zeros(N-1,N);
 for i=1:N
     if i>1 && i<N
         B(:,i)=[A(1:i-1); A(i+1:end)];
     elseif i==1
         B(:,i)=A(i+1:end);
     elseif i==N
         B(:,i)=A(1:i-1);
     end
 end

但我想要矢量化它。有什么帮助吗?

3 个答案:

答案 0 :(得分:4)

这是nchoosek以顺时针90 degree rotation生成的内容。

B = rot90(nchoosek(A,N-1),-1);   

答案 1 :(得分:4)

这是一个简单的选择:

[r, ~] = find(~eye(N));
B = reshape(A(r), N-1, N)

答案 2 :(得分:1)

根据您的示例,您只需删除每个N + 1条目:

N=5;
a=repmat(1:N,1,N); % make an NxN long vector 
a(1:N+1:end)=[]; % delete every N+1 entry
B=reshape(a,N-1,[]) % reshape to N-1 x N matrix