我在Matlab中有一个维度为(N-1)x1
的向量A
A=[0:1:N-2]'
使用N>=3
,例如使用N=4 A=[0 1 2]
我想在不使用循环的情况下构建维度为Mx(N-1)x(N-1)
的三维矩阵B
,例如使用N=4
、M=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]
以下是kron
和reshape
的一种方法:
A = 0:N-2;
B = reshape(kron(A, ones(M, N-1)), M, N-1, []);
我们使用CCD_ 11来生成CCD_ 12 2D矩阵,这些矩阵与CCD_ 13中的元素一样多,并且每个矩阵都乘以CCD_ 14中的相应值。下一步是取每个级联的2D矩阵,并将它们作为单独的切片放置在第三维度中,由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
这就是您想要的吗?
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
我将继续使用permute
,直到掌握窍门…
B = ones(M,N-1,N-1).*permute(A,[3,2,1])