matlab:查找和替换元胞数组中的矩阵元素
matlab: find and replace elements of matrices within a cell array
我有一个元胞数组,其中包含多个不同大小的矩阵。我想根据条件查找并替换矩阵的所有元素,例如用 0 替换所有 1。我从 find and replace values in cell array 找到了一个临时解决方案,但它似乎比应该的更复杂:
示例:
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{:}
答案=
0 2
3 4
答案=
0 2 3
4 5 6
7 8 9
所以它有效,但我觉得这应该是可行的,而无需首先指定替换值列表,然后 "exchanging" 所有元素。 (我必须在更复杂的条件下经常这样做)。有什么建议吗?
一种方法是使用 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);
样本 运行s -
>> 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
将 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
我有一个元胞数组,其中包含多个不同大小的矩阵。我想根据条件查找并替换矩阵的所有元素,例如用 0 替换所有 1。我从 find and replace values in cell array 找到了一个临时解决方案,但它似乎比应该的更复杂:
示例:
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{:}
答案=
0 2
3 4
答案=
0 2 3
4 5 6
7 8 9
所以它有效,但我觉得这应该是可行的,而无需首先指定替换值列表,然后 "exchanging" 所有元素。 (我必须在更复杂的条件下经常这样做)。有什么建议吗?
一种方法是使用 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);
样本 运行s -
>> 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
将 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