首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对单元格进行矢量化操作?

如何对单元格进行矢量化操作?
EN

Stack Overflow用户
提问于 2018-05-21 13:16:08
回答 1查看 86关注 0票数 1

给定B = {"7" "8" "9"},我想使用它的值分别替换A中每个单元格的最终元素,即transform

代码语言:javascript
复制
A = {{1 2} {3 4} {5 6}}

转到

代码语言:javascript
复制
A = {{1 "7"} {3 "8"} {5 "9"}}

在未矢量化的形式中,这可以写成:

代码语言:javascript
复制
nn = cellfun(@numel, A)
for i = 1:numel(a)
  A{i}{nn(i)} = B{i};
end

所有子小区可以具有相同的长度,但是用于任意长度的子小区的解决方案将是理想的。

我找到的唯一解决方案是制作A的重塑副本:

代码语言:javascript
复制
nn = cellfun(@numel, A)      #=> 2 2 2
A2 = horzcat(A{:})           #=> {1 2 3 4 5 6}
jj = cumsum(nn)              #=> 2 4 6
[A2{jj}] = B{:}              #=> {1 "7" 3 "8" 5 "9"}
ii = [1 jj(1:end-1)+1]       #=> 1 3 5
A = cellslices(A2,ii,jj,2)   #=> {{1 "7"} {3 "8"} {5 "9"}

我曾希望下面这样的东西能起作用--但它不起作用:

代码语言:javascript
复制
octave:1> [[A{:}]{ii}] = B{:}
error: invalid lvalue function called in expression

有没有一种方法可以向量化这个操作?

EN

回答 1

Stack Overflow用户

发布于 2018-05-21 15:23:20

从评论中了解到,您实际上只想避免显式的for/while循环,并且可以使用cellfun (它的使用不是矢量化),可以使用cellfun复制该过程,如下所示:

代码语言:javascript
复制
A = cellfun(@(k) {A{k}{1:end-1} B{k}}, num2cell(1:numel(A)), 'un', 0);

或者使用arrayfun作为:

代码语言:javascript
复制
 A = arrayfun(@(k) {A{k}{1:end-1} B{k}}, 1:numel(A), 'un', 0);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50442358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档