2017-12-03 12 views
0

私の主なスクリプトでは、同じ要素を持つSのセル配列を削除しようとしています。たとえば、あなたが(a=v=2付き)現在のスクリプトを実行した場合、その後、あなたはSに次の値を取得します:等しい要素を持つセル配列を削除する

S{1}(:, :, 1) = [0 0; 0 0]; S{1}(:, :, 2) = [0 0; 0 0]; 
S{2}(:, :, 1) = [0 0; 1 1]; S{2}(:, :, 2) = [0 1; 0 1]; 
S{3}(:, :, 1) = [0 1; 0 1]; S{3}(:, :, 2) = [0 0; 1 1]; 
S{4}(:, :, 1) = [1 0; 1 0]; S{4}(:, :, 2) = [1 1; 0 0]; 
S{5}(:, :, 1) = [1 1; 0 0]; S{5}(:, :, 2) = [1 0; 1 0]; 
S{6}(:, :, 1) = [1 1; 1 1]; S{6}(:, :, 2) = [1 1; 1 1]; 

コードは同じサブセットを持つようS{2}S{3}S{4}S{5}が表示されるはずです。したがって、私が得たい結果はS{1},S{2},S{4}、およびS{6}である必要があります。

私はMATLABがismember,isequalなどの機能を持っていることを知っていますが、セルアレイでは機能しないようです...またはそれらを動作させることができませんでした。

これは現在書かれているようにセルアレイでこれを処理する簡潔な方法はありますか?

メインスクリプト:

clear all 
clc 

a = 2; 
v = 2; 

R = dec2base(0:1:v^(v^a)-1, v)-'0'; 
cnt1 = 0; 
cnt2 = 0; 

for j=1:v^(v^a) 
    % List all degenerates in Psi1 
    V = FN_Break(a, v, R(j,:)); 
    if V > 0 % Connector is degenerate 
     cnt1 = cnt1 + 1; 
     Psi1(cnt1,1) = j-1; 
     % Store all "breaks" into cell array S 
     S{cnt1} = FN_Break_T(a,v,R(j,:)); 
    else % Connector is not degenerate 
     cnt2 = cnt2 + 1; 
     Psi2(cnt2,1) = j-1; 
    end 
end 

機能FN_Break

function [valU] = FN_Beak(a, v, R) 

FreeAtomCtr = 0; 

for j=0:v^a-1 
    for k=1:a 
     for l=1:a 
      B = dec2base(j,v,a); 
      atom(l,j+1) = str2num(B(l)); 
     end 
    end 
end 

for j=1:a % Do this for each atom 
    cnt(1:v) = 0; 
    for k = 1:v^a % Do this for each position of each atom 
     for l=0:v-1  % Break this down for each value 
      if atom(j,k) == l 
       cnt(1+l) = cnt(1+l) + 1; 
       T(1+l, cnt(1+l),j) = R(k); 
      end 
     end 
    end 
end 

for j=1:a 
    B = unique(T(:,:,j), 'rows'); 
    if dot(size(B), [1 0]) < v % does not depend on this atom 
     FreeAtomCtr = FreeAtomCtr + 1; 
    end 
end 

valU = FreeAtomCtr; 
end 

機能FN_Break_T

function [valU] = FN_Beak_T(a, v, R) 

FreeAtomCtr = 0; 

for j=0:v^a-1 
    for k=1:a 
     for l=1:a 
      B = dec2base(j,v,a); 
      atom(l,j+1) = str2num(B(l)); 
     end 
    end 
end 

for j=1:a % Do this for each atom 
    cnt(1:v) = 0; 
    for k = 1:v^a % Do this for each position of each atom 
     for l=0:v-1  % Break this down for each value 
      if atom(j,k) == l 
       cnt(1+l) = cnt(1+l) + 1; 
       T(1+l, cnt(1+l),j) = R(k); 
      end 
     end 
    end 
end 

for j=1:a 
    B = unique(T(:,:,j), 'rows'); 
    if dot(size(B), [1 0]) < v % does not depend on this atom 
     FreeAtomCtr = FreeAtomCtr + 1; 
    end 
end 

valU = T; 
end 
+0

関数によって出力されたセルに '2 x 2 x 2'の配列が含まれていることは意図的ですか? – excaza

+0

はい。謝罪私は「投票」タブにいて、あなたの質問を見ませんでした。 – dsmalenb

答えて

1

一つのアプローチは、あなたの組み合わせをハッシュし、セルの内容を比較するために、それらを使用することができ。 ismemberを使用して、可能な組み合わせ(この場合は4)に基づいてペアを索引付けし、次にsortを結果とし、uniqueを使用して、それぞれの固有の(ソートされた)ハッシュの最初のインスタンスを見つけ出すことができます。希望S与え

S{1}(:, :, 1) = [0 0; 0 0]; S{1}(:, :, 2) = [0 0; 0 0]; 
S{2}(:, :, 1) = [0 0; 1 1]; S{2}(:, :, 2) = [0 1; 0 1]; 
S{3}(:, :, 1) = [0 1; 0 1]; S{3}(:, :, 2) = [0 0; 1 1]; 
S{4}(:, :, 1) = [1 0; 1 0]; S{4}(:, :, 2) = [1 1; 0 0]; 
S{5}(:, :, 1) = [1 1; 0 0]; S{5}(:, :, 2) = [1 0; 1 0]; 
S{6}(:, :, 1) = [1 1; 1 1]; S{6}(:, :, 2) = [1 1; 1 1]; 

combinations = [0 0; 0 1; 1 0; 1 1]; 
% Assume array in every cell has the same shape 
hash = zeros(size(S{1}, 1)*size(S{1}, 3), numel(S)); 
for ii = 1:numel(S) 
    [~, hash(:,ii)] = ismember([S{ii}(:, :)].', combinations, 'rows'); 
end 

hash = sort(hash, 1).'; 
[~, keepidx] = unique(hash, 'rows'); 
S = S(keepidx); 

(セル1、2、4、6)


あなたの代わりに次のものを使用することができ、重複ネストする場合:たとえば

hash = sort(hash, 1).'; 
[~, keepidx, uniqueidx] = unique(hash, 'rows'); 
bincounts = accumarray(uniqueidx, 1); % Count occurrences 

for ii = 1:numel(bincounts) 
    if bincounts(ii) > 1 
     idx = find(uniqueidx == ii); 
     S{idx(1)} = S(idx); % Nest duplicates in first instance of duplicate 
    end 
end 
S = S(keepidx); 

これはuniqueの第3の出力とaccumarrayを使用して、各ユニークな組み合わせの発生回数を取得します。複製はネストされ、元のセル配列は以前と同様にプルーニングされます。

+0

私はあなたがその構造を変更した方法でS細胞アレイを編集したと思います。すべての項目をセミコロンで区切る必要はありません。 – dsmalenb

+0

上記の私の質問をご覧ください。 – excaza

+0

3D配列を1行で定義することはできません。上記の質問にお答えください。 – excaza

関連する問題