在Matlab

时间:2017-07-18 10:00:18

标签: matlab

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

我想重新排序X1X2X3 wrto X1然后 X2的每一行中的元素(如果X1的某些元素相等) 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);

3 个答案:

答案 0 :(得分:4)

由于数字介于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);

答案 1 :(得分:-3)

sort(X,2)将执行此操作。 2是按行进行。

答案 2 :(得分:-3)

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

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