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種類の情報を取得しようとしました。

最初: 行のサブセットの行列を取得して保存します。

2 番目: struc.names と比較して、対象の列 (required.names) に対応するベクトル (1 または 0 が入力された) を取得したい

3 番目: 行 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 0 1]; のようなベクトルで 1 (列名が存在する) と 0 (列名が存在しない) を取得したい。コードの書き方がわかりません。

問題 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 は、2 つのセットの共通要素を見つけます。ヘルプをご覧ください。2 番目のパラメーターは、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 に答える