我发现ndgrid 是最自然的解决方案,但这里有一个有趣的方法来手动完成kron 和repmat 这两个奇怪的组合:
M = [kron(1:size(A,2),ones(1,size(A,1))).' ... %' row indexes
repmat((1:size(A,1))',size(A,2),1) ... %' col indexes
reshape(A.',[],1)] %' matrix values, read across
简单的阅读调整,这在 MATLAB 中很自然:
M = [repmat((1:size(A,1))',size(A,2),1) ... %' row indexes (still)
kron(1:size(A,2),ones(1,size(A,1))).' ... %' column indexes
A(:)] % matrix values, read down
(也因为我的第一个答案是淫秽的。)
我还发现kron 是一个很好的工具,可以一次复制每个元素,而不是像repmat 那样一次复制整个数组。例如:
>> 1:size(A,2)
ans =
1 2 3
>> kron(1:size(A,2),ones(1,size(A,1)))
ans =
1 1 1 2 2 2 3 3 3
更进一步,我们可以生成一个名为 repel 的新函数来复制数组的元素而不是整个数组:
>> repel = @(x,m,n) kron(x,ones(m,n));
>> repel(1:4,1,2)
ans =
1 1 2 2 3 3 4 4
>> repel(1:3,2,2)
ans =
1 1 2 2 3 3
1 1 2 2 3 3