我cellfun用来将函数应用于单元格数组中的每个单元格.
我知道我必须设置'UniformOutput'到false每当功能,使得该函数的输出被在一个单元阵列返回的包封返回非标量值.
以下面的单元格数组为例:
C1 = {[1 2 3], [4 5 6]};
Run Code Online (Sandbox Code Playgroud)
C1 有两个单元格,每个单元格包含三个元素的向量:
C1 =
1×2 cell array
[1×3 double] [1×3 double]
Run Code Online (Sandbox Code Playgroud)
如果我想添加1到每个单元格中的内容,我可以定义该函数@(x) x + 1并使用cellfun如下方法应用它:
C2 = cellfun(@(x) x + 1, C1, 'UniformOutput', false);
Run Code Online (Sandbox Code Playgroud)
这非常有效,但请注意,我需要确保将'UniformOutput'其设置false为我之前解释过,否则将引发错误.
然而,看完之后此线程,我意识到,如果我用包功能单元阵列建设运营商{}这样的@(x) {x + 1}话,我并不需要设置'UniformOutput'到false.
因此,以下命令将生成与C2不丢弃任何错误相同的结果:
C3 = cellfun(@(x) {x + 1}, C1);
Run Code Online (Sandbox Code Playgroud)
在代码布局方面,我更喜欢这种方法,因为它比前者更紧凑,更简洁,但我不确定这是否总是安全的.
因此我的问题是:
我是否可以始终用函数包装 …
我想在单个结构中包含一些变量,以便更容易地输入和输出函数,因为它们被发送很多.问题是其中一个变量是一个单元格数组 - 特别是包含字符串.显然,一旦给出了变量之一
struct(var1,var2,...)
Run Code Online (Sandbox Code Playgroud)
是一个单元格数组,然后它使结构体成为结构的单元格数组,而不是让单元格数组成为结构的内部变量 - 这不是我想要的结果,并且需要大量的代码.
这个问题有解决方案/解决方法吗?
我有时会错过一个函数来生成(可能是嵌套的)单元格数组的字符串表示.这将是一个概括mat2str,它只适用于非单元格数组(数字,字符或逻辑类型).
给定一个数组
x,如何获取字符串表示y,以便评估此字符串产生x?
例如,输入
x = {[10 20], {'abc'; false; true;}};
Run Code Online (Sandbox Code Playgroud)
应该产生一个输出字符串
y = '{[10 20], {''abc''; false; true}}';
Run Code Online (Sandbox Code Playgroud)
(或关于间隔分隔物的一些变化),使得
isequal(x, eval(y))
Run Code Online (Sandbox Code Playgroud)
是true.
所以,我有一个不同长度的1xN向量的单元阵列.我想将它们附加到矩阵中,以便我可以显示它们imagesc.显然,矩阵必须是最大向量的宽度.我目前的代码如下:
tcell = {[1,2,3], [1,2,3,4,5], [1,2,3,4,5,6], [1], []};
lens = cellfun('length', tcell);
rmat = NaN(length(tcell), max(lens));
for i = 1:length(tcell)
rmat(i, 1:lens(i)) = tcell{i};
end
Run Code Online (Sandbox Code Playgroud)
有谁知道这种问题的矢量化解决方案?由于MATLAB的JIT,我并不是真的担心这个循环的速度.我只是想扩展我的知识,这是我在编程中经常遇到的一个案例.
我有一个矩阵(称之为X),初始化说zero(3).
我想更改代码,以便X是一个大小的单元格数组(比如说)(3,1)并初始化每个元素zero(3).
我可以用循环来做但有更好的方法吗?
X = cell(3,1);
for ii=1:numel(X)
X{ii} = zeros(3);
end
Run Code Online (Sandbox Code Playgroud) 这是为此问题创建示例单元数组的代码:
mycell = cell([5,1]);
for i = 1 : size(mycell)
mystruct = struct();
mycell{i} = mystruct;
mycell{i}.field1 = i;
end
Run Code Online (Sandbox Code Playgroud)
我期望mycell{:}.field1做我想做的事,但它给出了一个错误.我可以使用以下for循环:
for i = 1 : size(mycell)
mycell{i}.field1
end
Run Code Online (Sandbox Code Playgroud)
但我更喜欢更简单或更优雅的解决方案,因为想要将mycell.field1的所有元素用作绘图中的y变量.有任何想法吗?
假设它C是具有形状M ×1 的单元阵列(即,size(C)返回[ M 1]),并且每个元素C又是具有形状1× N的单元阵列 .
我经常要这样的单元阵列转换到新的单元阵列D具有形状1× Ñ,与元件是单元阵列具有形状中号 ×1,并且使得C{i}{j}等于D{j}{i}对于所有0 < 我 ≤ 中号,和0 < Ĵ ≤ Ñ.
我为此使用了以下怪物
D = arrayfun(@(j) arrayfun(@(i) C{i}{j}, (1:M)', 'un', 0), 1:N, 'un', 0);
Run Code Online (Sandbox Code Playgroud)
但是这个操作的需要经常出现(毕竟,它是一种"单元阵列转置"),我想我会问:
是否有更标准的方法来执行此操作?
请注意,所需D的不同
E = cat(2, C{:});
Run Code Online (Sandbox Code Playgroud)
或者,等效地,
E = cat(1, D{:});
Run Code Online (Sandbox Code Playgroud)
的E上面是一个二维(中号 × Ñ)单元阵列,而这两个C和D是一维单元阵列的一维单元阵列.当然,转换E回任何一个C或者D也是另一个经常需要的操作(这种事情永远不会用MATLAB结束),但我会把它留给另一个帖子.
这个问题背后的动机远远超出了上述问题.事实证明,我的MATLAB代码的 …
我想将一个函数应用于单元格数组的每个元素 - 所以我有cellfun这个.但是,该函数需要两个额外的参数(一个字符串和一个向量),我想为单元格数组的所有元素保持不变; 即我想做的事情:
cellfun(@myfun, cellarray, const1, const2)
Run Code Online (Sandbox Code Playgroud)
含义:
for i = 1:numel(cellarray),
myfun(cellarray{i}, const1, const2);
end
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点,而不创建包含和的numel(cellarray)副本的中间单元格数组?const1const2
我有一个c等大小数组的单元格数组,即size(c{n}) = [ m l ... ]任何数组n.如何在一次扫描中获取所有数组元素的mean值(对单元数组索引n求平均值)?我想过使用cell2mat和mean,但前者不另一个层面,但变化添加l到l*n.手动循环当然需要永远......
>> C = [{1} {2} ; {'@CF'} {2}]
C =
[ 1] [2]
'@CF' [2]
>> whos C
Name Size Bytes Class Attributes
C 2x2 478 cell
Run Code Online (Sandbox Code Playgroud)
我怎样才能转换C成double:
>> C
C =
1 2
NaN 2
Run Code Online (Sandbox Code Playgroud)
我试过了str2double(C).它返回:
NaN NaN
NaN NaN
Run Code Online (Sandbox Code Playgroud)