【问题标题】:Create all possible n-tuples from n vectors in Matlab, ordered in a specific way在 Matlab 中从 n 个向量创建所有可能的 n 元组,以特定方式排序
【发布时间】:2020-12-16 19:16:05
【问题描述】:

考虑 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)是第二行向量的一个元素,...,Tcoord(i,n)是最后一行向量的一个元素.

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

现在假设我扩充 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 的行在矩阵Tcoord_augmented_reshape 中,这样

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

  • Tcoord_augmented_reshape 的其余行包含Tcoord_augmented 的其他左侧行。

【问题讨论】:

  • 那段代码看起来很眼熟...
  • 确实如此,不是吗?

标签: arrays matlab matrix


【解决方案1】:

最简单的方法是构建一个与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, :);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    相关资源
    最近更新 更多