在Matlab中从n个向量创建所有可能的n元组,按特定方式排序



考虑Matlab中的n行向量,每个向量的大小为1xU。例如,

U=20;
n=3;
sU=[U U U];
vectors = arrayfun(@(x) {1:x}, sU); 

其中vector{1}是第一行矢量,vector{2}是第二行矢量,。。。,vector{n}是最后一行矢量。

我们创建大小为U^n x n的矩阵Tcoord,报告来自n行向量的所有可能的n-元组。对于Tcoord的每一行iTcoord(i,1)是第一行矢量的元素,Tcoord(i,2)是第二行矢量的元件,CCD_ 14是最后一行矢量的元素。

Tcoord_temp = cell(1,n);
[Tcoord_temp{:}] = ndgrid(vectors{:}); 
Tcoord_temp = cat(n+1, Tcoord_temp{:});
Tcoord = reshape(Tcoord_temp,[],n); 

现在假设I扩充3元素的每个n行向量。例如,

vectors_augmented{1}=[vectors{1} 8 9 10];
vectors_augmented{2}=[vectors{2} 11 12 13];
vectors_augmented{3}=[vectors{3} 14 15 16];

然后我创建了一个类似于Tcoord的矩阵,但现在使用vectors_augmented

Tcoord_temp = cell(1,n);
[Tcoord_temp{:}] = ndgrid(vectors_augmented{:}); 
Tcoord_temp = cat(n+1, Tcoord_temp{:});
Tcoord_augmented = reshape(Tcoord_temp,[],n); %(U+3)^nxn

我希望您能帮助在矩阵Tcoord_augmented_reshape中重新排序矩阵Tcoord_augmented的行,以使

  • Tcoord_augmented_reshape(1:U^n,:)等于Tcoord

  • CCD_ 23的其余行包含CCD_ 24的其它左侧行。

最简单的方法是构建一个与Tcoord_augmented大小相同的辅助零一矩阵,并基于此对行进行排序:

aug_size = [3 3 3]; % augment size of each vector. Not necessarily equal
vectors_aux = arrayfun(@(a) {[false(1,U) true(1, a)]}, aug_size);
T_aux = cell(1,n);
[T_aux{:}] = ndgrid(vectors_aux{:}); 
T_aux = cat(n+1, T_aux{:});
T_aux = reshape(T_aux,[],n); 
[~, ind] = sortrows(T_aux, n:-1:1); % indices of stably sorting the rows.
% Most significant column is rightmost, as per your code
Tcoord_augmented_reorder = Tcoord_augmented(ind, :);

最新更新