2017-04-16 433 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