用于计算相似性分数的 Matlab 循环问题
Matlab Looping Issue for counting similarity score
我有 3 组不同长度和大小的数据(AA、B1 和 C1)。我的代码的目的是能够计算数据之间的相似性分数,例如 AA 和 B1、AA 和 C1、B1 和 C1 之间的相似性分数。所以下面是我的代码,它应该能够计算相似度分数,但循环中存在一些问题。每对不同长度的数据只有最高值select。输出应为 AA-B1:0.2226、AA-C1:0.2037 和 B1-C1:0.1111,表示每对的相似度得分。
实际上,我的代码的输出,尤其是 max_val{i}
是根据对的大小假设的。例如,大小为 1 x 2 的对在 max_val
输出中应该有一个值而不是三个。谢谢
A1={[4,3,4,3,3]};
A2={[3,1,2,4]};
A3={[1,2,4]};
AA=[A1,A2,A3];
B1={[2,2,4,4]};
C1={[4,4,4,3,2,2]};
set={[AA],[B1],[C1]};
comb_set=nchoosek(set,2); %combinations of two sets
for h=1:size(comb_set,1)
comb_pair=comb_set(h,:)';
sets=comb_pair;
cat=horzcat(sets{:});
c=reshape(repmat(sets{1},numel(sets{2}),1),numel(sets{1})*numel(sets{2}),1);
d=repmat(sets{2}(:),length(sets{1}),1);
pairs=[c d];
ind=cellfun(@numel,pairs(:,1)) > cellfun(@numel,pairs(:,2));
pairs(ind,[1 2]) = pairs(ind,[2 1]) %possible pairs of the row of subset
p=cell(size(pairs,1),1);
for i=1:size(pairs,1)
%the two vectors
[a,b]=deal(pairs{i,:});
%sliding window indices, and compute the sum
idx=hankel(1:numel(a),numel(a):numel(b));
count_minus{i}=bsxfun(@minus,b(idx.'),a); %count minus between pairs
count_total{i}=numel(a)+numel(b); %count total
count_intersect{i}=sum(count_minus{i}'==0)'; %count no. of intersection
union{i}=count_total{i}-count_intersect{i}; %union
subset{i}=count_intersect{i}./union{i}; %subset each pair similarity score
max_val{i}=max(subset{i}) %maximum similarity score
bsum=cellfun(@(x) sum(x),max_val);
total{i}=sum(bsum~=0);
average=sum(bsum) / total{i}
end
end
您有 2 个 for 循环用于 i
和 h
,并在内部循环中使用 max_val{i}
。这意味着相同的 max_val
单元格结构将用于 h
的每个值 - 在本例中为 size(comb_set,1)=3
。对于 h
的每次迭代,前一次迭代中定义的 max_val{i}
将被覆盖。因为在第一个和第二个 运行 size(pairs,1)=3
中,单元格的长度为 3。在最后一个 size(pairs,1)=1
中。该单元格的长度仍为 3,但您将只覆盖第一个元素 - 您可以查看您提供的代码的输出,并看到最后两个元素等于前一个 h
迭代的最后两个元素。您需要以不同方式定义 max_val
。您可以定义一个数组以将最大值保留在 i
循环中并将其写入 max_values{h}
例如。
当您遇到这样的错误时,可以更轻松地生成一个最小的工作示例并检查问题所在。这段代码很难阅读,也是因为缺少缩进。 CTRL+A 和 CTRL+I 让你的生活更轻松。
我有 3 组不同长度和大小的数据(AA、B1 和 C1)。我的代码的目的是能够计算数据之间的相似性分数,例如 AA 和 B1、AA 和 C1、B1 和 C1 之间的相似性分数。所以下面是我的代码,它应该能够计算相似度分数,但循环中存在一些问题。每对不同长度的数据只有最高值select。输出应为 AA-B1:0.2226、AA-C1:0.2037 和 B1-C1:0.1111,表示每对的相似度得分。
实际上,我的代码的输出,尤其是 max_val{i}
是根据对的大小假设的。例如,大小为 1 x 2 的对在 max_val
输出中应该有一个值而不是三个。谢谢
A1={[4,3,4,3,3]};
A2={[3,1,2,4]};
A3={[1,2,4]};
AA=[A1,A2,A3];
B1={[2,2,4,4]};
C1={[4,4,4,3,2,2]};
set={[AA],[B1],[C1]};
comb_set=nchoosek(set,2); %combinations of two sets
for h=1:size(comb_set,1)
comb_pair=comb_set(h,:)';
sets=comb_pair;
cat=horzcat(sets{:});
c=reshape(repmat(sets{1},numel(sets{2}),1),numel(sets{1})*numel(sets{2}),1);
d=repmat(sets{2}(:),length(sets{1}),1);
pairs=[c d];
ind=cellfun(@numel,pairs(:,1)) > cellfun(@numel,pairs(:,2));
pairs(ind,[1 2]) = pairs(ind,[2 1]) %possible pairs of the row of subset
p=cell(size(pairs,1),1);
for i=1:size(pairs,1)
%the two vectors
[a,b]=deal(pairs{i,:});
%sliding window indices, and compute the sum
idx=hankel(1:numel(a),numel(a):numel(b));
count_minus{i}=bsxfun(@minus,b(idx.'),a); %count minus between pairs
count_total{i}=numel(a)+numel(b); %count total
count_intersect{i}=sum(count_minus{i}'==0)'; %count no. of intersection
union{i}=count_total{i}-count_intersect{i}; %union
subset{i}=count_intersect{i}./union{i}; %subset each pair similarity score
max_val{i}=max(subset{i}) %maximum similarity score
bsum=cellfun(@(x) sum(x),max_val);
total{i}=sum(bsum~=0);
average=sum(bsum) / total{i}
end
end
您有 2 个 for 循环用于 i
和 h
,并在内部循环中使用 max_val{i}
。这意味着相同的 max_val
单元格结构将用于 h
的每个值 - 在本例中为 size(comb_set,1)=3
。对于 h
的每次迭代,前一次迭代中定义的 max_val{i}
将被覆盖。因为在第一个和第二个 运行 size(pairs,1)=3
中,单元格的长度为 3。在最后一个 size(pairs,1)=1
中。该单元格的长度仍为 3,但您将只覆盖第一个元素 - 您可以查看您提供的代码的输出,并看到最后两个元素等于前一个 h
迭代的最后两个元素。您需要以不同方式定义 max_val
。您可以定义一个数组以将最大值保留在 i
循环中并将其写入 max_values{h}
例如。
当您遇到这样的错误时,可以更轻松地生成一个最小的工作示例并检查问题所在。这段代码很难阅读,也是因为缺少缩进。 CTRL+A 和 CTRL+I 让你的生活更轻松。