2017-04-16 6 views
2

J'ai un tableau de cellules qui contient plusieurs matrices de tailles différentes. Je voudrais trouver & remplacer tous les éléments des matrices par une condition, par exemple. remplacer tous les 1 avec 0. J'ai trouvé une solution temporaire find and replace values in cell array, mais il semble plus compliqué qu'il doit être:matlab: rechercher et remplacer des éléments de matrices dans un tableau de cellules

Exemple:

A = {[1 2;3 4] [1 2 3;4 5 6;7 8 9]} 
replacement = 1:9; 
replacement(replacement==1)=0; 
A = cellfun(@(x) replacement(x) ,A,'UniformOutput',false) 
A{:} 

ans =

0  2 
3  4 

ans =

0  2  3 
4  5  6 
7  8  9 

Donc, cela fonctionne mais je pense que cela devrait être faisable sans d'abord spécifier une liste de remplacement va repères et ensuite "échanger" tous les éléments. (Je dois le faire beaucoup et avec des conditions plus complexes). Aucune suggestion?

Répondre

2

Une approche serait avec elementwise-multiplication avec le masque de ce 1s -

cellfun(@(x) (x~=1).*x, A, 'uni',0) 

run Exemple -

>> celldisp(A) % Input cell array 
A{1} = 
    3  2 
    1  4 
A{2} = 
    7  1  3 
    4  5  1 
    7  8  9 
>> C = cellfun(@(x) (x~=1).*x, A, 'uni',0); 
>> celldisp(C) 
C{1} = 
    3  2 
    0  4 
C{2} = 
    7  0  3 
    4  5  0 
    7  8  9 

cas générique: Pour le rendre générique qui pourrait remplacer un nombre par un autre numéro, nous avons besoin d'une légère modification, comme si -

function out = replace_cell_array(A, oldnum, newnum) 

out = cellfun(@(x) x+(x==oldnum).*(newnum-oldnum), A, 'uni',0); 

runs exemples -

>> A = {[1 2;3 5] [1 2 3;5 5 3;7 8 9]}; % Input cell array 
>> celldisp(A) 
A{1} = 
    1  2 
    3  5 
A{2} = 
    1  2  3 
    5  5  3 
    7  8  9 
>> celldisp(replace_cell_array(A,1,0)) % replace 1s with 0s 
ans{1} = 
    0  2 
    3  5 
ans{2} = 
    0  2  3 
    5  5  3 
    7  8  9 
>> celldisp(replace_cell_array(A,3,4)) % replace 3s with 4s 
ans{1} = 
    1  2 
    4  5 
ans{2} = 
    1  2  4 
    5  5  4 
    7  8  9 
+0

ne fonctionne que dans le cas spécifique de remplacement des éléments à 0, mais c'est un cas très fréquent et il est une solution très nette pour ce cas. Merci! –

+0

@lmoes Étendre à un cas générique était assez facile. Consultez les modifications. – Divakar

+0

C'est exactement ce que j'ai cherché, merci encore. –

1

Utilisation cellfun avec une fonction anonyme a la limitation d'une fonction anonyme can only contain a single statement. Donc, il ne peut pas attribuer de valeur à une entrée de la matrice (à moins que vous n'ayez recours à des astuces moche, non recommandées).

Pour éviter cela, vous pouvez utiliser une boucle for. Ce n'est pas nécessairement plus lent que cellfun. En fait, il est peut-être un peu plus vite, et est sans doute plus facile à lire:

A = {[1 2;3 4] [1 2 3;4 5 6;7 8 9]} 
repl_source = 1; 
repl_target = 0; 
for k = 1:numel(A) 
    A{k}(A{k}==repl_source) = repl_target; 
end