0

我有一些数据,我想从中获取一些信息。但是,我遇到了一些问题,我很乐意得到专家的帮助。

数据和一些信息:

A = [1 0 -1 2 0 1;0 2 1 0 1 -2;1 1 0 2 1 1]%matrix
B = [1 3]#rows 1 and 3 are rows for searching.
struc.names = ['blue', 'red', 'green', 'amber', 'grey','yellow']% a structure of column names.
required.names = {'blue', 'green', 'grey','yellow'}; % a structure of required column names

我尝试获取以下 3 种类型的信息:

第一:获取并保存行子集的矩阵。

第二:与struc.names相比,我想获得一个与感兴趣的列(required.names)相对应的向量(填充1或0)

第三:对于第 1 行和第 3 行,当行元素不为零时,查找 struc.names 和 required_rows 之间的匹配项;还要根据匹配的数量安排结果输出。

问题1:

 code for getting matrix:
 struc.names = {'blue', 'red', 'green', 'amber', 'grey','yellow'};
 required_rows = [1 3];
 for k = 1:length(required_rows);
    % open file for writing
    fid =fopen('ouput.txt','w');
    idx(k,:) = A(required_rows(k),:);
    fprintf(fid,'%d \n',idx);#print matrix
 end;

获得的输出:

 1 0 -1 2 0 1 1 1 0 2 1 1

所需输出:

 1 0 -1 2 0 1 
 1 1 0 2 1 1

问题 2:与 struc.names 比较时,获取 required.names = {'blue', 'green', 'grey','yellow'} 的列向量;

我想在如下向量中获取 1(存在列名)和 0(不存在列名): [1 0 1 0 0 1]; 我不确定如何编写代码。

问题 3:当行元素非零时,查找 struc.names 和 required_rows 之间的匹配,然后获得根据匹配数排列的排序结果的代码。代码:

struc.names = ['blue', 'red', 'green', 'amber', 'grey','yellow']# a structure  of  column  names.
required.names = {'blue', 'green', 'grey','yellow'}; # a structure of required  column names
struc.names = {'blue', 'red', 'green', 'amber', 'grey','yellow'}
required_rows = [1 3];
% open file for writing, and Loop
fid=fopen('file.txt','w+');
for K = 1 : length(required_rows);
    idx = A(required_rows(K),:) ~= 0;
    if any(idx)
    struc.names = struc.names(idx)
    C = intersect(struc.names ,required_rows)       
    fprintf(fid, 'row A(%d,:) has the following matches:\n');
    fprintf(fid, '%s ', C{idx} );
    fprintf(fid, '\n');
    end
end
fclose(fid);

所需的排序输出(根据匹配数):

 row 3: blue red amber grey yellow
 row 1: blue green amber yellow

谢谢

4

1 回答 1

2

问题1。

A(required_rows,:)

ans =

 1     0    -1     2     0     1
 1     1     0     2     1     1

问题 2. 可以使用 intersect 在 struct.names 中查找 required.names。intersect 查找两个集合的公共元素。看看帮助。第二个参数返回 struct.names 中交集的索引。所以事实上 struct.names{match} 存在于 required.names 中。

v=zeros(1, numel(struct.names));
[~, match] = intersect(struct.names, required.names);
v(match)=1

v =

 1     0     1     0     1     1

问题 3。

idx = A(required_rows,:) ~= 0;
[~,perm] = sort(sum(idx,2),'descend');
for i=1:length(perm)
    matches = struct.names(idx(perm(i), :));
    display(['Row ' num2str(required_rows(perm(i))) ' has the following matches: ' ...
    sprintf('"%s" ', matches{:})]);
end

Row 3 has the following matches: "blue" "red" "amber" "grey" "yellow" 
Row 1 has the following matches: "blue" "green" "amber" "yellow" 

要获得每行中匹配的百分比,您需要将匹配中的元素数除以 struct.names 中的元素数:

numel(matches)/numel(struct.names)*100
于 2012-09-26T07:45:52.603 回答