考虑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
的每一行i
,Tcoord(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, :);