Matlab 通过比较两个单元格之间的值来索引表的行
我有一张像上面附件一样的桌子。列A和列B包含单元格数组中的一些元素。我想创建第三列(级别)作为结果列;基于以下逻辑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函数来比较单元格中的值,但我
我正在使用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];这是错误的。如有任何建议/帮助,将不胜感激。非常感谢。