2015-06-25 53 views
0

3-d矩阵I具有矢量A在Matlab尺寸(N-1)x1生成从一个矢量在Matlab

A=[0:1:N-2]' 

N>=3,例如与N=4 A=[0 1 2]

我想构建维度Mx(N-1)x(N-1)的3维矩阵B而不使用循环,例如,与N=4M=5

B(:,:,1)=[0 0 0 0; 
      0 0 0 0; 
      0 0 0 0; 
      0 0 0 0; 
      0 0 0 0] 

B(:,:,2)=[1 1 1 1; 
      1 1 1 1; 
      1 1 1 1; 
      1 1 1 1; 
      1 1 1 1] 

...

B(:,:,end)=[N-2 N-2 N-2 N-2; 
      N-2 N-2 N-2 N-2; 
      N-2 N-2 N-2 N-2; 
      N-2 N-2 N-2 N-2; 
      N-2 N-2 N-2 N-2] 

回答

2

这是你想要的吗?

B = repmat(reshape(A,1,1,[]), M, N-1); %// or change N-1 to N, according to your example 

另一种可能性:

B = bsxfun(@times, reshape(A,1,1,[]), ones(M, N-1)); %// or change N-1 to N 

另一个:

B = reshape(A(ceil((1:numel(A)*M*(N-1))/M/(N-1))), M, N-1, []); %// or change N-1 to N 
3

这里有一个方法与kronreshape

A = 0:N-2; 
B = reshape(kron(A, ones(M, N-1)), M, N-1, []); 

我们使用kron生成M x (N-1)二维矩阵,堆叠的元素数量与A中的元素数量相同,每个矩阵乘以A中的相应值。下一步是采用每个连接的二维矩阵,并将它们作为单独的切片放置在第三维中,由reshape完成。

M = 5, N = 4

>> B 

B(:,:,1) = 

    0  0  0 
    0  0  0 
    0  0  0 
    0  0  0 
    0  0  0 


B(:,:,2) = 

    1  1  1 
    1  1  1 
    1  1  1 
    1  1  1 
    1  1  1 


B(:,:,3) = 

    2  2  2 
    2  2  2 
    2  2  2 
    2  2  2 
    2  2  2 
2

我打算使用permute,直到我得到了它的窍门,以保持示例...

B = ones(M,N-1,N-1).*permute(A,[3,2,1])