等价的cellfun(@(x)x / sum(x(:)),y,'UniformOutput',0)?

时间:2015-11-05 22:09:00

标签: matlab scilab

如何替换matlab函数cellfun

y = cellfun(@(x) x/sum(x(:)), y, 'UniformOutput',0);
y = cellfun(@sqrt, y, 'UniformOutput',0);

带循环。我想将此代码转换为Scilab,但我不明白cellfun对x的作用。你能用C或Java(或其他语言)形式编写一些等效的代码吗?

1 个答案:

答案 0 :(得分:2)

执行

yout=cell(size(y));
for k=1:numel(y)
   yout{k}=sqrt(y{k}/sum(y{k}(:)));
end
y=reshape(yout,size(y));

说明:第一次调用cellfun将遍历原始单元格y的每个元素,然后将函数@(x) x/sum(x(:))应用于单元格的每个元素(即它将标准化每个单元元素使得它们各自的元素和等于1)。结果存储在输出单元的相应元素中。第二个调用对sqrt函数执行相同的操作,因此我们可以在循环中将同一命令中的两个操作联合起来。

一些证据:

y={[1 2], [3 4]; [5 6], [7 8]; [9 10], [11 12]};

yout1 = cellfun(@(x) x/sum(x(:)), y, 'UniformOutput',0);
yout1 = cellfun(@sqrt, yout1, 'UniformOutput',0);

yout2=cell(size(y));
for k=1:numel(y)
   yout2{k}=sqrt(y{k}/sum(y{k}(:)));
end
yout2=reshape(yout2,size(y));

isequal(yout1,yout2) %returns 1