Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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_For Loop_Indexing_Comparison - Fatal编程技术网

Matlab 通过比较两个单元格之间的值来索引表的行

Matlab 通过比较两个单元格之间的值来索引表的行,matlab,for-loop,indexing,comparison,Matlab,For Loop,Indexing,Comparison,我有一张像上面附件一样的桌子。列A和列B包含单元格数组中的一些元素。我想创建第三列(级别)作为结果列;基于以下逻辑 单元格A的值=单元格B的值将被标记为1的行。(在第三行中,A列的值=B列的值=3,因此标记为1) 接下来,前面的值将从所有 A柱的细胞;然后重复步骤1,直到所有 行被标记。(在第二步中,将从所有 因此,第1行和第2行的单元格都将标记为2;在 最后一步,将从最后一行中进一步删除元素{1,2} 结果将级别设置为3) 我正在使用cell2mat和setdiff函数来比较单元格中的值,但我

我有一张像上面附件一样的桌子。列A和列B包含单元格数组中的一些元素。我想创建第三列(级别)作为结果列;基于以下逻辑

  • 单元格A的值=单元格B的值将被标记为1的行。(在第三行中,A列的值=B列的值=3,因此标记为1)

  • 接下来,前面的值将从所有 A柱的细胞;然后重复步骤1,直到所有 行被标记。(在第二步中,将从所有 因此,第1行和第2行的单元格都将标记为2;在 最后一步,将从最后一行中进一步删除元素{1,2} 结果将级别设置为3)


  • 我正在使用cell2mat和setdiff函数来比较单元格中的值,但我无法设置上述两个逻辑步骤来成功运行代码。我刚刚开始学习MATLAB,非常感谢您的帮助。

    这不是我最好的作品,我认为有可能去掉内部循环

    % your testdata
    A = {[1 2 3]
        [2 3]
        3
        [1,2,4]};
    B = {[1 2]
        2
        3
        4};
    
    
    Level = NaN(numel(B),1);
    temp = A; % copy of A that we are going to remove elements from
    k = 0; % loop couter
    while any(isnan(Level)) % do until each element of Level is not NaN
        k = k+1; % increment counter by 1
    
        % step 1
        idx = find(cellfun(@isequal,temp,B)); % determine which cells are equal
        Level(idx) = k; % set level of equal cells
    
        % step 2
        for k = 1:numel(idx) % for each cell that is equal
            %remove values in B from A for each equal cell
            temp = cellfun(@setdiff,temp,repmat(B(idx(k)),numel(B),1),'UniformOutput',0);
        end   
    end
    

    下面是我能想到的最简单的答案,使用一个while循环,假设
    a
    B
    的单元格包含行向量:

    Level = zeros(size(A));
    index = cellfun(@isequal, A, B);
    while any(index)
      Level(index) = max(Level)+1;      
      A = cellfun(@(c) {setdiff(c, unique([A{index}]))}, A);
      index = cellfun(@isequal, A, B);
    end
    
    上述代码首先初始化与
    a
    大小相同的
    Level
    矩阵,以存储级别值。然后使用and查找
    索引
    ,其中
    a
    B
    之间存在匹配的单元格内容。只要有
    索引
    指示的匹配项,它将继续运行。
    级别
    中的相应索引设置为
    级别
    中的当前索引加上一。
    A
    中的所有匹配单元格内容都是唯一的([A{index}])
    。然后使用一个操作(连同
    cellfun
    )从
    A
    中的每个单元格中删除匹配值,并用剩余值覆盖
    A
    。然后计算匹配项的新
    索引
    ,并重新启动循环

    根据您问题中的以下示例数据:

    A = {[1 2 3]; [2 3]; 3; [1 2 3 4]};
    B = {[1 2]; 2; 3; 4};
    
    该代码返回预期的级别向量:

    Level =
    
         2
         2
         1
         3
    

    如果B列的第2行是3而不是2,会发生什么情况?这可能吗?@Leander,谢谢你的评论。那是不可能的。假设这是给定的数据。开发算法的逻辑是什么?有什么建议吗?老兄,非常感谢。你救了我。如果您能帮我解释一下以上内容,我将不胜感激。我刚开始做这件事MATLAB@pradeepkumarTarei:我为使用的函数添加了说明和一些文档链接。但是上面的代码不适用于大数据。请考虑以下事项。A={[1,5,6,9];[1,2,4,5,6,8,9,10];[1,2,3,4,5,6,8,9,10];[2,3,4,5,8,10];[1,2,3,4,4,5,5,6,8,10];[4,5,6,8,10];[4,5,8,10];[2,3,4,5,6,8,10];[2,3,4,5,5,8,10];B={[1,5];[2,4,5,9,10];[3,4,5,9,10];[2,3,4,5,8];[1,2,3,4,5,6,8,10];[5,6];[7];[4,5,8,10];[2,3,9];[2,3,5,8,10];根据上述逻辑,正确答案应为:[3,3,3,2,1,2,2,1,2,1]。但是,它产生[0,0,0,0,1,0,2,1,0,1];这是错误的。如有任何建议/帮助,将不胜感激。谢谢你。@pradeepkumarTarei:你的例子毫无意义。根据您在问题中的要求,在
    A
    B
    之间匹配的任何行都应标记为1,然后将其包含的值从
    A
    的所有单元格中删除。这使得
    A
    有5个空单元格,1个单元格有7个,4个单元格有9个。如果你想要不同的东西,你需要澄清你的问题。是的,你是绝对正确的。请考虑以下作为额外的限制。1.A和B之间匹配的任何行应标记为1,然后从A和B中删除相同的值。A和B之间匹配的任何空单元格将标记为相同(先前)级别。(说2)2。任何不匹配的单元格值(或A列中的剩余值)将标记为下一个值。(假设3)上述2个条件将产生所需结果(如上例所示)。请建议/帮助我修改代码。但是上述代码不适用于大数据。请考虑以下事项。A={[1,5,6,9];[1,2,4,5,6,8,9,10];[1,2,3,4,5,6,8,9,10];[2,3,4,5,5,‌​8,10];[1,2,3,4,5,6,8‌​,10];[4,5,6,8,10];[4‌​,5,7,10];[4,5,8,10];‌​[2,3,4,5,6,8,9,10];[‌​2,3,5,8,10]}; B={[1,5];[2,4,5,9,10];[3,4,5,9,10];[2,3,4,5,8];[1,2,3,4,5,6,8,‌​10];[5,6];[7];[4,5,8‌​,10];[2,3,9];[2,3,5,‌​8,10]}; 根据上述逻辑,正确答案应为:[3,3,3,2,1,2,2,1,2,1]。但是,它产生[0,0,0,0,1,0,2,1,0,1];这是错误的。如有任何建议/帮助,将不胜感激。非常感谢。