在Matlab中结合使用cellfun和subs

3

我有一些存储在矩阵中的值,例如:

Matrix = [1,4,6]

以及一个类似于以下的单元数组:

CellArray{1} = [0,0,1,0]
...
CellArray{4} = [0,0,0,0,0,0,0,1]
...
CellArray{6} = [0,0,1,1,1,0]

对于CellArray中的每个矩阵元素,即CellArray{Matrix(1:end)},我想要将其中的1替换成0。目前,我的想法是:
[Output] = cellfun(@(x) subs(x,1,0),{CellArray{Matrix}},'UniformOutput',false)

尽管如此,输出结果并不是我想要的...

subs不是你想象中的那样,请尝试使用subs([2,3,4],2,1)。你现在做的应该可以工作,但我不确定匿名函数如何为你进行替换。 - Andras Deak -- Слава Україні
1
@AndrasDeak 2015b :) - Jonas
1
如果我理解正确的话,你应该可以使用@(x) double(subs(x,1,0))将其转换为数字数组。 - Andras Deak -- Слава Україні
1
它变成符号的原因是它是一种设计用于处理符号数组的符号函数。对于纯数字数组而言,它能够正常工作是一个小奇迹(如你所见,它对我来说并不起作用)。这是函数强烈不建议的用法,所以你应该预计会出现一些奇怪的情况。 - Andras Deak -- Слава Україні
我已经考虑了你的问题,并决定这可能对未来的读者有用。因此,我添加了一个答案。我还修复了你问题中的语法错误(并重新标记为[cell-array])。 - Andras Deak -- Слава Україні
显示剩余10条评论
3个回答

1
正如我们在评论中所解决的那样,问题在于 subs() 是符号计算工具箱的一部分,并返回符号数组。请注意,在 R2012b 中,该函数甚至不会将其替换为数字数组,但您正在使用 R2015b,在其中进行替换。

因此,解决方案是在您的cellfun中明确地转换为数字数组:

[Output] = cellfun(@(x) double(subs(x,1,0)),{CellArray{Matrix}},'UniformOutput',false);

或者,由于符号数学非常缓慢,也许一种类似的低效基于字符串的解决方案可能具有竞争力:
oddrep = @(x) str2num(regexprep(num2str(x),'1','0'));
[Output] = cellfun(oddrep,{CellArray{Matrix}},'UniformOutput',false);

1

由于示例表明CellArray仅包含具有01的向量(问题未指定相反的情况),因此我建议

Output = cellfun(@(x)zeros(1, numel(x)), CellArray(Matrix), 'uniformoutput', 0)

这实际上只是用适当长度的零向量替换了该条目。


在我的情况下,只有 01 存在,这个答案是完美的。它解决了 subs 问题并且易于理解/实现。 - Jonas

1
开玩笑的回答放在一边,有一个名为subsasgn的方法可以实现这个功能:
Output = cellfun(@(x)subsasgn(x, struct('type','()', 'subs',{{find(x==1)}}), 0), CellArray(Matrix), 'uniformoutput', 0);

这对于存在非零和非一条目的情况可以正常工作。它应该比字符串或符号方法更快。并且可以修改此内容,以使CellArray的条目在原地修改。
编辑:
以下难以理解的单行代码将替换Matrix指示的CellArray元素。
CellArray = subsasgn(CellArray, struct('type', '()', 'subs', {{Matrix}}), cellfun(@(x)subsasgn(x, struct('type','()', 'subs',{{find(x==1)}}), 0), CellArray(Matrix), 'uniformoutput', 0))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接