【问题标题】:Reordering rows of several arrays in Matlab在Matlab中重新排序几个数组的行
【发布时间】:2017-07-18 10:00:18
【问题描述】:

考虑三个矩阵X1X2X3 在 Matlab 中的维度为Nx(N-1),列出了0,1,...,10 中的一些整数。

我想对X1X2X3 wrto X1那么X2的每一行中的元素重新排序(如果@987654331的某些元素@ 相等) X3如果X2 的某些元素相等) 升序排列。

示例 1

N=3;
X1=[3 8;
    7 7;
    2 1];

X2=[10 1;
    10 9;
    4 4];


X3=[1 1;
    1 0;
    1 0];

%I want to obtain
X1new=[3 8;
       7 7;
       1 2];

X2new=[10 1;
       9 10;
       4 4];

X3new=[1 1;
       0 1;
       0 1];

示例 2

N=4;
X1=[3 8 9;
    7 6 6;
    2 1 4;
    4 4 4];

X2=[10 1 2;
    9  10 10;
    4 4 5;
    5 5 2];


X3=[1 1 1;
    0 0 1;
    1 0 0;
    0 0 0];


%I want to obtain
X1new=[3 8 9;
       6 6 7;
       1 2 4;
       4 4 4];

X2new=[10 1 2;
       10 10 9;
       4 4 5;
       2 5 5];

X3new=[1 1 1;
       0 1 0;
       0 1 0;
       0 0 0];

这段代码做我想做的事。对于size(Y,1) 很大的情况,您能否建议更有效的替代方案(如果有)?

% 1) Create a 3d matrix Y of dimension Nx(N-1)x3
Y=NaN(N,N-1,3);
Y(:,:,1)=X1;
Y(:,:,2)=X2;
Y(:,:,3)=X3;

% 2) Reorder elements in each row (independently) 
     %wrto Y(:,:,1), then Y(:,:,2), then Y(:,:,3) in ascending order.
     %Store everything in Ynew of dimension Nx(N-1)x3 
Ynew = NaN(N,N-1,3);
for h = 1:size(Y,1),
    Ynew (h,:,:) = sortrows(squeeze(Y(h,:,:)), [1 2 3]);
end

% 3) Create X1new, X2new, X3new
X1new=Ynew(:,:,1);
X2new=Ynew(:,:,2);
X3new=Ynew(:,:,3);

【问题讨论】:

  • 应该X2new[1 10;9 10; 4 4] 而不是[10 1;9 10; 4 4]
  • @Steve 不,我只在X1 中的某些元素相等时才重新排序X2
  • 我还是不太明白你的意思。也许你可以逐步完成你的例子。
  • 由于您的流程是顺序的(检查 x1,然后是 x2,...)我认为您无法线性化您的代码。

标签: matlab


【解决方案1】:

由于数字介于010 之间,您可以轻松地将三个矩阵合并为一个以进行排序(步骤1);对组合矩阵的每一行进行排序并获得该排序的索引(步骤 2);并从中构建一个线性索引(步骤 3),您可以将其用于原始矩阵(步骤 4):

M = 11; % Strict upper bound on possible values
Y = X1 + X2/M + X3/M^2; % STEP 1: combined matrix
[~, cols] = sort(Y, 2); % STEP 2: sort each row and get indices of sorting
ind = bsxfun(@plus, (1:size(X1,1)).', (cols-1)*size(X1,1)); % STEP 3: linear index
X1new = X1(ind); % STEP 4: result
X2new = X2(ind);
X3new = X3(ind);

【讨论】:

    【解决方案2】:

    sort(X,2) 会这样做。 2是按行进行。

    【讨论】:

    • 这不是我想要的,不是简单的排序。
    • 啊,没有看到你只想在行元素相等时执行此操作的条件。问题:如果行有 3 个元素怎么办?例如:A = [3 2 1; 1 1 2; 1 2 3];在第二行,有两个。这是否意味着 A 已排序?或者你想让所有元素在 A 被排序之前都相等(所以只有当 A 是 A = [3 2 1; 1 1 1; 1 2 3];
    • 看我的例子N=4
    【解决方案3】:

    只需使用即可完成 'sort' command in Matlab

    X1new = sort(X1,2);
    X2new = sort(X2,2);
    X3new = sort(X3,2);
    

    【讨论】:

    • 这不是我想要的,不是简单的排序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多