根据特定列对3D矩阵进行排序

时间:2016-05-14 18:03:56

标签: matlab

我有3D矩阵(10*10*4),我试图在此之后根据2列缩短每个切片,并根据列2我要删除所有行列2上的值小于1且大于17

我使用此代码进行排序,但它无法正常工作

clc;
clear;
A = rand(10,10,4)
column = 2;
[values,indices] = sort(A(:,column,:)) 
B = A(indices,:,:)

由于

1 个答案:

答案 0 :(得分:1)

以下是排序代码。

clc;
clear all;
A = rand(10,10,4);
column = 2;
z=A(:,column,:);
[values,indices] = sort(z,1) ;
B=zeros(size(A,1),size(A,2),size(A,3));
for i=1:size(A,3)
B(:,:,i) =A(indices(:,:,i),:,i);
end

此处AB中的所有值都在01之间。因此,检查少于1和大于17是没有意义的。另一件事是当你删除一行时,你打算用第三维做什么?如果您分别对每个第三维进行删除B(:,:,1), B(:,:,2), B(:,:,3), B(:,:,4)。每个维度B(:,:,1), B(:,:,2), B(:,:,3), B(:,:,4)将具有不同的行数。 B不能有不同的行数。

更新代码,当该行第二列中的所有值小于0.05或所有值时,排序和删除行该行的列大于0.15

clc;
clear all;

A = rand(10,10,4);

%% sorting
column = 2; % sort base on column
z=A(:,column,:);
[values,indices] = sort(z,1) ;
B=zeros(size(A,1),size(A,2),size(A,3));
for i=1:size(A,3)
B(:,:,i) =A(indices(:,:,i),:,i);
end


%% deleting row
C=B;
column=2; % delete base on column
rowSize=size(C,1);
i=1;
while true
    count=0;
    count1=0;
    for j=1:size(C,3)
        if(C(i,column,j)< 0.05)
            count=count+1;
        end
        if(C(i,column,j)> 0.15)
            count1=count1+1;
        end
    end
    if (count==size(C,3) || count1==size(C,3))
        C(i,:,:)=[];
        rowSize=rowSize-1;
    else
        i=i+1;
    end
    if (i>rowSize)
        break;
    end
end

更新代码,当该行第二列中的任何值小于0.05或任何值时,排序和删除行该行的列大于0.15

%% deleting row
C=B;
column=2; % delete base on column
rowSize=size(C,1);
i=1;
while true
    flag=0;
    for j=1:size(C,3)
        if(C(i,column,j)< 0.05 || C(i,column,j)> 0.15)
            flag=1;
            break;
        end
    end
    if (flag==1)
        C(i,:,:)=[];
        rowSize=rowSize-1;
    else
        i=i+1;
    end
    if (i>rowSize)
        break;
    end
end