请问如何使用MATLAB进行元胞数组批量提取数据。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问如何使用MATLAB进行元胞数组批量提取数据。相关的知识,希望对你有一定的参考价值。
我的元胞数组是1行209列的,假设我要提取其中每个元胞中的第1列和第209列,并将其合并成一个新的矩阵,请问怎么操作,谢谢。
我的元胞数组是1行209列的,假设我要提取其中每个元胞中的第1列和最后1列,并将其合并成一个新的矩阵,请问怎么操作,谢谢。
假设A是209个元素的元胞数组,并且每个元素矩阵的行数相同。
B=[];for n=1:length(A)
B=[B,An(:,[1 end])];%我不知道你想怎么合并,我就按A1两列A2两列...An两列这样的顺序合了,不是的话你自己改
end追问
你好,谢谢你的回答,不过我提示了部分错误的信息:
??? for?n=1:209
|
Error: Unexpected MATLAB operator.
for?n=1:209我好想没有写这个吧,for和n中间哪来的问号
追问额。。。我确实是运行了这个,
不过貌似还是这个问题。。。我这里的data就是A。。。
??? for?n=1:length(data)
|
Error: Unexpected MATLAB operator.
里面每个小的矩阵都是180行72列的。。。
谢谢。。。
不要直接复制,你手动输入一下命令。网上答题有时候网站会自己添加一些我们看不到的字符。
追问真的成功了 非常谢谢你!!!我也想知道要是我不是合并他们的列,而是合并他们的行需要修改什么地方呢。。。比如我要合并胞元中每个矩阵的第一行和最后一行,也把它做成一个大的矩阵。。。非常感谢,我再加点分,很晚了。。。ORZ
追答合并行
B=[];
for n=1:length(A)
B=[B;An([1 end],:)];
end
num=size(yourcell1,2);
alldata=[yourcell:];
yourdata_1_209=alldata(:,mod((1:end),num)==1 | mod((1:end),num)==209)
yourdata_1_END=alldata(:,mod((1:end),num)==1 | mod((1:end),num)==0)
使用 Matlab Coder 对字符串元胞数组进行字符串比较
【中文标题】使用 Matlab Coder 对字符串元胞数组进行字符串比较【英文标题】:String comparison on cell array of strings with Matlab Coder 【发布时间】:2019-07-03 20:39:23 【问题描述】:我正在尝试使用 MATLAB Coder 工具箱将以下代码转换为 C:
function [idx] = list_iterator(compare, list)
idx = nan(length(list));
for j = 1:length(list)
idx(j) = strcmp(compare, listj);
end
list
是一个 N x 1 的字符串元胞数组,compare
是一个字符串。该代码基本上将list
的每个元素与compare
进行比较,如果两者相同则返回1
,否则返回0
。 (我这样做是为了加快执行速度,因为 N 可能非常大 - 大约 10 到 2000 万个元素。)
当我在命令行窗口中运行codegen list_iterator
时,出现以下错误:
函数“list_iterator”的输入参数“比较”的类型 未指定。使用 -args 或预处理语句来指定 输入类型。
更多信息
==> list_iterator 行中的错误:1 栏目:18
代码生成失败:查看错误报告
使用代码生成时出错
我知道在使用codegen
时我应该指定输入的类型,但我不确定如何为字符串元胞数组执行此操作,其中的元素可以具有不同的长度。字符串compare
也可以有不同的长度,具体取决于函数调用。
【问题讨论】:
【参考方案1】:您可以使用函数coder.typeof
来指定codegen
的可变大小输入。根据我对您的示例的理解,类似于:
>> compare = coder.typeof('a',[1,Inf])
compare =
coder.PrimitiveType
1×:inf char
>> list = coder.typeof(compare, [Inf,1])
list =
coder.CellType
:inf×1 homogeneous cell
base: 1×:inf char
>> codegen list_iterator.m -args compare, list
似乎合适。
如果您查看 MATLAB Coder App,它提供了一种指定这些复杂输入的图形方式。从那里您可以将其导出到构建脚本以查看相应的命令行 API:
https://www.mathworks.com/help/coder/ug/generate-a-matlab-script-to-build-a-project.html?searchHighlight=build%20script&s_tid=doc_srchtitle
请注意,当我使用 codegen
尝试此示例时,生成的 MEX 并不比 MATLAB 快。发生这种情况的原因之一是函数的主体相当简单,但是大量数据从 MATLAB 传输到生成的代码并返回。因此,这种数据传输开销会支配执行时间。将更多代码移至生成的 MEX 可能会改善这一点。
考虑与codegen
无关的性能,您应该使用idx = false(length(list),1);
而不是idx = nan(length(list));
?前者是Nx1逻辑向量,后者是NxN双矩阵,我们只写list_iterator
的第一列。
使用您的原始代码和输入 compare = 'abcd'; list = repmat('abcd';'a';'b',1000,1);
这给了时间:
>> timeit(@()list_iterator(compareIn, listIn))
ans =
0.0257
修改您的代码以返回一个向量会缩小:
function [idx] = list_iterator(compare, list)
idx = false(length(list),1);
for j = 1:length(list)
idx(j) = strcmp(compare, listj);
end
>> timeit(@()list_iterator(compareIn, listIn))
ans =
0.0014
您还可以使用单元格和字符数组调用strcmp
,这样可以使代码更快:
function [idx] = list_iterator(compare, list)
idx = strcmp(compare, list);
>> timeit(@()list_iterator(compareIn, listIn))
ans =
2.1695e-05
【讨论】:
以上是关于请问如何使用MATLAB进行元胞数组批量提取数据。的主要内容,如果未能解决你的问题,请参考以下文章