私は画像のような行列を持っています。この行列では、ある行の値のいずれかが別の行にある場合、短い行が削除されます。たとえば、2行目から5行目にはすべて3が含まれているため、5行目(ゼロ以外の値が最も多い行)のみを残し、他のすべての行を削除したい...解決策を提案してください。MATLAB。行の値のいずれかが別の行にある場合、行を削除するにはどうすればよいですか?
おかげ
私は画像のような行列を持っています。この行列では、ある行の値のいずれかが別の行にある場合、短い行が削除されます。たとえば、2行目から5行目にはすべて3が含まれているため、5行目(ゼロ以外の値が最も多い行)のみを残し、他のすべての行を削除したい...解決策を提案してください。MATLAB。行の値のいずれかが別の行にある場合、行を削除するにはどうすればよいですか?
おかげ
私は以下のコードがうまくいくと思います。この考え方は、行の要素の数に従って最初に行列をソートし、次に一致する行をループして削除することです。おそらくない最も効率的なコードが、原則的に動作するはずです。..もっと説明
% generating the data
M = zeros(6, 10);
M(2,1:3) = [3 8 10];
M(3,1:4) = [3 8 10 9];
M(4,1:5) = [3 8 10 9 7];
M(5,1:6) = [3 8 10 9 7 4];
M(6,1) = [5];
% sorting according to the number of non-zero elements
nr_of_nonzero = sum(M~=0, 2);
[~, sort_indices] = sort(nr_of_nonzero);
M_sorted = M(sort_indices,:);
M_sorted(M_sorted==0)=NaN; % should not compare 0s (?)
% get rid of the matches
for i=1:size(M_sorted, 1)-1
for j=(i+1):size(M_sorted, 1)
[C,ia,ib] = intersect(M_sorted(i,:),M_sorted(j,:));
if numel(C)>0
M_sorted(i,:) = NaN;
end
break;
end
end
% reorder
M(sort_indices,:) = M_sorted;
% remove all NaN rows
M(all(isnan(M),2),:) = [];
% back to 0s
M(isnan(M)) = 0;
私はここですべてのコードを実行するが、ここで私はそれを解決するのにかかる手順だいませんよ。意図した結果(つまり、ベクトル演算、whileループ、forループなど)を得るには、さまざまな方法を試す必要があります。
問題
行が反復され、よりコンパクトな形で削減する必要があります。
ソリューションは
mat2str
を検索します。tmpstr1 = mat2str(yourMatrix(rowToBeCompared, :));
strcmp
は、文字列の文字(または文字列自体が)同じかどうかを確認するには:あなたはそれが適切なyourMatrix[rowToDelete, : ] = [];
はそれを試してみて、それが動作するかどうかを確認して見つけた場合
注 - ステップ3の拡張:したがって、あなたがループして文字列を解析することができます
a(4)
ans = '+'
a(5)
ans = '1'
a(1)
and = '['
:
我々はa = '[ab+11]';
変数を持っている場合、我々は次のように文字列から個々の文字を選択することができます:
for n = 1 : length(a)
if a(n) == '1' || a(n) == '0'
str(n) = a(n);
end
end
Sardar Usama氏によると、私たちができるようにコードを提供すると便利です独自のMATLABワークスペースに貼り付けて貼り付けます。
のコメントを参照してくださいおかげでたくさん.....本当に便利 –
おかげでたくさん...私のために素晴らしい作品。 –