我有一张上面附件的表格。 A列和B列包含一些单元阵列的元素。我想创建第三列(Level)作为结果列;基于以下逻辑。
单元格A的值=单元格B的值将被标记为1的行。 (在第3行中,A列的值= B列的值= 3,因此标记为1)。
接下来,将从全部删除前面的值 A列的细胞;并且将重复步骤1直到全部 行标记。 (在第二步中,将从全部删除3 因此,第1行和第2行都将被标记为2; 最后一步,元素{1,2}将从最后一行中进一步删除 结果为3)
我正在使用 cell2mat 和 setdiff 函数来比较单元格中的值,但我无法构建上述2个逻辑步骤以成功运行我的代码。我刚开始学习MATLAB,非常感谢任何帮助。
答案 0 :(得分:2)
这是我能提出的最简单的答案,使用单个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
上述代码首先初始化与Level
大小相同的zeroes A
矩阵,以存储关卡值。然后,它使用logical index和cellfun
找到index
A
与B
和index
之间匹配的单元格内容的isequal
Level
。只要Level
指示loop次匹配,它就会继续any。 A
中的相应索引设置为unique([A{index}])
中的当前maximum value加1。来自cellfun
的所有匹配单元格内容均为concatenated,A
找到unique个值。然后使用set difference操作(以及A
)从index
中的每个单元格中删除匹配值,并使用其余值覆盖A = {[1 2 3]; [2 3]; 3; [1 2 3 4]};
B = {[1 2]; 2; 3; 4};
。然后计算匹配的新Level =
2
2
1
3
并重新开始循环。
根据您的问题提供以下示例数据:
let calculate ~size_of_experiment:s ~number_of_buckets:n =
let results = run_experiments s n in
List.iter (fun x -> print_endline x) results;
List.fold_left (fun x y -> x + (snd y)) 0 results
代码返回预期的级别向量:
Error: This expression has type (int * int) list
but an expression was expected of type string list
Type int * int is not compatible with type string
答案 1 :(得分:1)
不是我最好的工作,我认为可以摆脱内循环。
% 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