2017-04-16 659 views
2

我有一個單元格數組,其中包含多個不同大小的矩陣。我希望找到&用條件替換矩陣的所有元素,例如,用0代替全部1。我發現了一個臨時的解決方案,從find and replace values in cell array,但似乎這樣更復雜,它應該是:matlab:查找和替換單元格陣列中的矩陣元素

例子:

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 

所以它的工作原理,但我覺得這應該是可行的,沒有首先指定一個替代VA列表然後「交換」所有元素。 (我必須做很多事情,並且需要更復雜的條件)。有什麼建議麼?

回答

2

一種方法是用elementwise-multiplication這樣的1s的面具 -

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

採樣運行 -

>> 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 

一般情況下:爲了讓通用的,可以通過任何更換任何數量的其他號碼,我們需要稍作修改,像這樣 -

function out = replace_cell_array(A, oldnum, newnum) 

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

樣品試驗 -

>> 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

只能與0替代元素的具體情況,但是這是一個很常見的情況,它是爲這種情況下非常巧妙的解決辦法。謝謝! –

+0

@lmoes擴展到一般情況很容易。查看編輯。 – Divakar

+0

這正是我一直在尋找的,再次感謝你。 –

1

使用cellfun一個匿名函數的限制,即一個匿名函數can only contain a single statement。所以它不能爲矩陣的條目分配一個值(除非你使用醜陋的,不推薦的技巧)。

爲了避免這種情況,您可以使用for循環。這不一定比cellfun慢。事實上,它可能會快一點,而且更易讀:

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