请问如何使用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

参考技术A 如果每个元胞内的矩阵相同,则可如下处理
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进行元胞数组批量提取数据。的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB中,我要把元胞数组中的字符串提取出来,应该用啥函数?

matlab元胞数组如何提取里面的具体元素?

matlab中的元胞数组如何实现批量的赋值呢?

将元胞数组值提取为 java 数据类型

matlab批量处理元胞数组函数-cellfun

关于MATLAB cell元胞数组中元素的引用问题