Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 提取特定子列的矩阵操作:反向思想_Matlab_Matrix_Cell Array - Fatal编程技术网

Matlab 提取特定子列的矩阵操作:反向思想

Matlab 提取特定子列的矩阵操作:反向思想,matlab,matrix,cell-array,Matlab,Matrix,Cell Array,我有一个矩阵M和一个单元格X,如下所示A包含唯一的M(1:3,:)列向量A的引入只是为了解释我想要什么,这不是初始数据 我尝试修改下面的程序,以代替查找A(1:3,:)的列向量,其M(4,:)中的对应值不是单元格X的向量之一的一部分(显然不等于这些向量之一)。现在,我想找到A(1:3,:)的列向量,其M(4,:)中的对应值至少包含一个单元格X的向量(或等于这些向量之一)。 例如,结果应为: out = 622 1007 124 552

我有一个矩阵
M
和一个单元格
X
,如下所示
A
包含唯一的
M(1:3,:)
列向量
A
的引入只是为了解释我想要什么,这不是初始数据

我尝试修改下面的程序,以代替查找
A(1:3,:)
的列向量,其
M(4,:)
中的对应值不是单元格
X
的向量之一的一部分(显然不等于这些向量之一)。现在,我想找到
A(1:3,:)
的列向量,其
M(4,:)
中的对应值至少包含一个单元格
X
的向量(或等于这些向量之一)。 例如,结果应为:

out =

        622   1007
        124    552
         88   2010
我要修改的代码:

 M = [1007  1007  4044  1007  4044  1007  5002 5002 5002 622 622;
       552   552   300   552   300   552   431  431  431 124 124; 
      2010  2010  1113  2010  1113  2010  1100 1100 1100  88  88;
         7    12    25    15    12    30     2   10   55  32  12];

A = [1007  4044  5002  622;
      552   300   431  124;
     2010  1113  1100   88];
M = [1007  1007  4044  1007  4044  1007  5002 5002 5002 622 622;
      552   552   300   552   300   552   431  431  431 124 124; 
     2010  2010  1113  2010  1113  2010  1100 1100 1100  88  88;
        7    12    25    15    12    30     2   10   55  32  12];


 X = {[2 5 68 44],[2 10 55 9 17],[1 55 6 7 8 9],[32 12],[30 12 15]};



[C,~, subs] = unique(M(1:3,:)','rows');

A4 = accumarray(subs(:),M(4,:).',[],@(x) {x});


idxC = false(size(A4));
NX = numel(X);

for jj = 1:NX
     for ii = 1:length(A4)
        A4i=A4{ii};

        issubset = false;
        for xj = X{jj}.'
            if ismember(xj,A4i)
               issubset = true;
               break;
            end;
        end;
        if issubset
            idxC(ii) = true;
            break;
        end;
    end;
end;


out = C(idxC,:).';

out =

         622        1007
         124         552
          88        2010
A
包含唯一的
M(1:3,:)

有两条捷径。第一,如果在
X{jj}
中找不到
A4{ii}
的任何元素,不要测试
A4{ii}
的其余部分,从下一个
jj
开始。其次,如果在任何
X{jj}
中找到
A4{ii}
的所有元素,则不要测试
jj
的剩余值,请删除该
A4{ii}

>> out

out =

    1007        4044
     552         300
    2010        1113
我尝试了这段代码,它给出了正确的结果,但我不知道它是否正确:

 M = [1007  1007  4044  1007  4044  1007  5002 5002 5002 622 622;
       552   552   300   552   300   552   431  431  431 124 124; 
      2010  2010  1113  2010  1113  2010  1100 1100 1100  88  88;
         7    12    25    15    12    30     2   10   55  32  12];

A = [1007  4044  5002  622;
      552   300   431  124;
     2010  1113  1100   88];
M = [1007  1007  4044  1007  4044  1007  5002 5002 5002 622 622;
      552   552   300   552   300   552   431  431  431 124 124; 
     2010  2010  1113  2010  1113  2010  1100 1100 1100  88  88;
        7    12    25    15    12    30     2   10   55  32  12];


 X = {[2 5 68 44],[2 10 55 9 17],[1 55 6 7 8 9],[32 12],[30 12 15]};



[C,~, subs] = unique(M(1:3,:)','rows');

A4 = accumarray(subs(:),M(4,:).',[],@(x) {x});


idxC = false(size(A4));
NX = numel(X);

for jj = 1:NX
     for ii = 1:length(A4)
        A4i=A4{ii};

        issubset = false;
        for xj = X{jj}.'
            if ismember(xj,A4i)
               issubset = true;
               break;
            end;
        end;
        if issubset
            idxC(ii) = true;
            break;
        end;
    end;
end;


out = C(idxC,:).';

out =

         622        1007
         124         552
          88        2010

这是我的方法。在阅读之前,请记住这可能不是最快/最棘手的方法

%Extracting the values of M(4,:) as blocks (I kept your way to do it)
[C, ~, subs] = unique(M(1:3,:)','rows');    
A4 = accumarray(subs(:),M(4,:).',[],@(x) {x});

%Finding which A4 elements contains at least a vector of x
containsX = arrayfun(@(it)cellfun(@(x)all(ismember(x,A4{it})),X),1:length(A4),'UniformOutput',0)';

%Converting containsX into array so I can use `any`
containsX_array = cell2mat(containsX);

%Extracting the elements of A concerned
out = A(:,find(ismember(A',C(any(containsX_array,2),1:3),'rows')));
我确实在一些示例上运行了它,它似乎可以毫无问题地工作

%TEST :

M = [1007  1007  4044  1007  4044  1007  5002 5002 5002 622 622;
       552   552   300   552   300   552   431  431  431 124 124; 
      2010  2010  1113  2010  1113  2010  1100 1100 1100  88  88;
         7    12    25    15    12    30     2   10   55  32  12];

A = [1007  4044  5002  622;
      552   300   431  124;
     2010  1113  1100   88];

X = {[2 5 68 44],[2 10 55 9 17],[1 55 6 7 8 9],[32 12],[30 12 15]};

>> out

out =

        1007         622
         552         124
        2010          88

“我想修改下面的程序…”好的,你尝试过修改程序吗?如果是的话,你在哪里被卡住了?由于您的问题目前已编写完毕,您似乎只是要求Stackoverflow为您编写代码。@Biker:我不是每天都编程,即使对于您认为简单的问题,我也很难解决。这不是为了成功,而是为了尝试。解释您不想要的东西有时是有用的,但通常不足以让人们轻易地帮助你。请在您的问题描述中包含类似的内容:我有变量M、A和X,如下所示。M是包含…的变量,a是包含…的变量,X是包含…的变量。我想要达到的是,我试过这样做。。。(看起来你在第一段中已经试过这么做了,但这很让人困惑)谢谢你的回答。它可以工作,但我想更改的代码更快!