假设我有单元格数组
strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}
Run Code Online (Sandbox Code Playgroud)
如果我想找到索引,我该怎么办'KU'?
如何检测单元阵列中的空单元格?我知道删除空单元格的命令是a(1) = [],但我似乎无法让MATLAB自动检测哪些单元格为空.
背景:我预先分配了一个单元格数组a=cell(1,53).然后我使用if exist(filename(i))和textscan来检查文件,并将其读入.结果,当filename(i)不存在时,会产生一个空单元格,然后我们移动到下一个文件.
当我读完所有文件后,我想删除空单元格a.我试过了if a(i)==[]
在R2016b中,除了通常的char数据类型之外,MATLAB还引入了一种新的字符串数据类型.到目前为止,这么好,但它现在给了我很多我正在使用的JSONlab工具箱的问题.
例如,在R2015b中,loadjson返回1x3单元字符数组:
dd = loadjson('["Titi", "Toto", "Tata"]')
dd =
'Titi' 'Toto' 'Tata'
Run Code Online (Sandbox Code Playgroud)
但是在R2018a中,loadjson返回1x3 字符串数组:
dd = loadjson('["Titi", "Toto", "Tata"]')
dd =
1×3 cell array
{["Titi"]} {["Toto"]} {["Tata"]}
Run Code Online (Sandbox Code Playgroud)
为了不必在任何地方更改我的代码,我想修补loadjson例程以替换string它可能返回char类型的所有类型.例如,在以下单元格数组中:
test = { 'hello', "world", 0.3; 'how', 'are', "you"}
test =
2×3 cell array
{'hello'} {["world"]} {[0.3000]}
{'how' } {'are' } {["you" ]}
Run Code Online (Sandbox Code Playgroud)
我想替换所有字符串:
cellfun(@isstring, test)
ans =
2×3 logical array …Run Code Online (Sandbox Code Playgroud) 使用括号()和花括号访问单元格数组中的元素有什么区别{}?
例如,我试图使用 cell{4} = []和cell(4) = [].在第一种情况下,它将第4 个元素设置为[],但在第二种情况下,它消灭了单元格元素,即将单元格元素数量减少1.
正如标题已经提到的那样,如何在现有单元阵列的末尾添加一个新的单元阵列1x1,让我们称之为Q单元阵列1x3256?
这有内置功能吗?
今天我很惊讶地发现了这一点
A = {1,2,3}
Run Code Online (Sandbox Code Playgroud)
和
B = {1,2,3,}
Run Code Online (Sandbox Code Playgroud)
在MATLAB中都是有效的语法.我原以为第二个语句会产生错误.尽我所知,他们生成相同的单元格数组(all([A{:}]==[B{:}])返回true).
有没有理由允许第二种语法?这是解析器中的错误吗?是A与B真正的一样吗?
有趣的是,以下是不合法的:
C = {1,2,3,,,}
Run Code Online (Sandbox Code Playgroud) 我有一个空单元格数组和一些我想要转换为逻辑数组的单元格,其中空单元格为零.当我使用cell2mat时,空单元格被忽略,我最终得到一个只有1的矩阵,没有引用它们持有的先前索引.有没有办法在不使用循环的情况下执行此操作?
示例代码:
for n=1:5 %generate sample cell array
mycellarray{n}=1;
end
mycellarray{2}=[] %remove one value for testing
Run Code Online (Sandbox Code Playgroud)
我试过的事情:
mylogicalarray=logical(cell2mat(mycellarray));
Run Code Online (Sandbox Code Playgroud)
这导致[1,1,1,1],而不是[1,0,1,1,1].
for n=1:length(mycellarray)
if isempty(mycellarray{n})
mycellarray{n}=0;
end
end
mylogicalarray=logical(cell2mat(mycellarray));
Run Code Online (Sandbox Code Playgroud)
哪个有效,但使用循环.
我有一个<20x1>单元格数组,每个数组都以字符串的形式存储一些数据(因为它在我看来!!!).我想访问单元格的每个元素作为单个字符串,并且拆分是单词.
我所拥有的单元阵列是<20x1>单元阵列,并且作为我使用for循环的单元访问每个元素.
for i=1:20
line=newline{i}
end
Run Code Online (Sandbox Code Playgroud)
它向我展示了数组中的所有元素.现在因为line是一个字符串,所以我应用strsplit函数来检索字符串中的单词.
for i=1:20
words(i,:)=strsplit(line)
end
Run Code Online (Sandbox Code Playgroud)
这给了我一个错误信息:
??? Undefined function or method 'strsplit' for input
arguments of type 'char'.
Error in ==> chk at 15
words=strsplit(newline{i})
Run Code Online (Sandbox Code Playgroud)
谁能解释我错在哪里?任何帮助将不胜感激.提前致谢.
我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)
在代码布局方面,我更喜欢这种方法,因为它比前者更紧凑,更简洁,但我不确定这是否总是安全的.
因此我的问题是:
我是否可以始终用函数包装 …