在 MATLAB 中不使用循环通过元胞数组的一维连接子元胞

2023-12-20

我有一个元胞数组。每个单元格包含一个可变长度的向量。例如:

example_cell_array=cellfun(@(x)x.*rand([length(x),1]),cellfun(@(x)ones(x,1), num2cell(ceil(10.*rand([7,4]))), 'UniformOutput', false), 'UniformOutput', false)

我需要将单元格的内容向下连接到一个维度,然后对每个连接的向量执行操作,为单元格数组中的每一列生成标量(例如 sum() - 实际操作很复杂、耗时,而且不自然)可矢量化 - 特别是对于不同长度的矢量)。

我可以通过循环轻松地完成此操作(对于我的串联向量和示例),如下所示:

[M N]=size(example_cell_array);
result=zeros(1,N);
cat_cell_array=cell(1,N);
for n=1:N
    cat_cell_array{n}=[];
    for m=1:M
        cat_cell_array{n}=[cat_cell_array{n};example_cell_array{m,n}];
    end
end
result=cell2mat(cellfun(@(x)sum(x), cat_cell_array, 'UniformOutput', false))

不幸的是,这太慢了。 (我的元胞数组为 1Mx5,每个元胞中的向量长度范围为 100-200)

是否有一种简单的方法来生成连接元胞数组,其中元胞中包含的向量已按一维连接?

就像是:

dim=1;
cat_cell_array=(?concatcells?(dim,example_cell_array);

编辑: 由于很多人一直在测试解决方案:仅供参考,我应用于每个连接向量的函数是 circ_kappa(x) ,可从循环统计工具箱 http://www.mathworks.com/matlabcentral/fileexchange/10676-circular-statistics-toolbox--directional-statistics-/content/circ_kappa.m


有些方法可能会建议您将数字数据从example_cell_array using {..}然后在串联后将其打包回更大尺寸的单元格以形成您的cat_cell_array。然后,您再次需要从该串联元胞数组中解压缩数字数据以执行您的操作手术在每个单元格上。

现在,在我看来,如果以下情况,这种多重拆包和打包方法将不是有效的方法:example_cell_array不是您的预期输出之一。因此,考虑到所有这些,让我在这里建议两种方法。


循环的方法

第一个是 for 循环代码 -

data1 =  vertcat(example_cell_array{:}); %// extract all numeric data for once
starts = [1 sum(cellfun('length',example_cell_array),1)]; %// intervals lengths
idx = cumsum(starts); %// get indices to work on intervals basis
result  = zeros(1,size(example_cell_array,2)); 
%// replace this with "result(size(example_cell_array,2))=0;" for performance
for k1 = 1:numel(idx)-1
    result(k1) = sum(data1(idx(k1):idx(k1+1)-1));
end

所以,你需要编辑sum与你的实际手术.


近矢量化方法

If example_cell_array有很多专栏,我的第二个建议是almost向量化方法,尽管它在列数较少的情况下表现也不错。现在这段代码使用cellfun在第一行获取串联版本中每个单元格的长度。cellfun基本上是循环代码的包装器,但这在运行时方面并不是很昂贵,这就是为什么我将这种方法归类为almost矢量化一。

代码是 -

lens = sum(cellfun('length',example_cell_array),1); %// intervals lengths
maxlens = max(lens);
numlens = numel(lens);
array1(maxlens,numlens)=0;
array1(bsxfun(@ge,lens,[1:maxlens]')) = vertcat(example_cell_array{:}); %//'
result = sum(array1,1);

你现在需要做的就是让你的手术在列的基础上运行array1使用创建的掩码bsxfun执行。因此,如果array1 is a M x 5大小的数组,您需要使用掩码从每列中选择有效元素,然后执行手术在那些元素上。如果您需要有关屏蔽问题的更多信息,请告诉我。

希望这些方法之一对您有用!


快速测试:用一个250000x5 sized example_cell_array,快速测试表明这两种方法sum操作表现非常好并给予约400x比我最后问题中的代码加速。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 MATLAB 中不使用循环通过元胞数组的一维连接子元胞 的相关文章

  • MATLAB 可执行文件太慢

    我使用以下命令将 MATLAB 程序转换为基于控制台的应用程序deploytool在 MATLAB 中 MATLAB m文件执行大约需要 2 秒 但在我将其转换为可执行文件并调用 exe 执行需要45秒 太长了 我想将 MATLAB 程序与
  • 将二维数组拆分为每行数组的最Pythonic方法是什么?

    我有一个函数 foo 返回形状为 1000 2 的数组 如何将其拆分为两个数组 a 1000 和 b 1000 我正在寻找这样的东西 a b foo 我正在寻找一个可以轻松推广到形状为 1000 5 左右的情况的答案 The zip idi
  • c中的数组名到底是什么?

    我很难理解 C 中数组名称的类型和使用 这可能看起来很长 但请耐心等待 我理解以下声明声明a属于类型int i e 整数数组 int a 30 While a还指向数组的第一个元素以及诸如此类的东西 a 2 是有效的 因此 使得a看起来像一
  • 获取 LLVM getelementptr 中的操作数名称

    我正在尝试获取 getelementptr 指令引用的数组的名称 当在实际的 C 代码中使用中间变量对数组进行索引时 这似乎起作用 如下所示 int a 0 i a 3 在这种情况下 我得到以下位码 arrayidx getelementp
  • PHP:将数组添加在一起

    有人可以帮我解释一下吗 我有两段代码 其中一个按我的预期工作 但另一个则不然 这有效 a array a gt 1 b gt 2 b array c gt 3 c a b print r c Output Array a gt 1 b gt
  • 为什么数组索引或基索引以 0 开头?

    在使用任何语言处理数组时 我一直想知道为什么数组的基地址或索引号以零开头 int x 5 21 34 55 314 45 现在 如果我想访问数组的任何第一个值 我将不得不使用x 0 但是为什么 0 这背后有什么逻辑呢 在 C 语言中 数组的
  • 存储 PHP 数组的首选方法(json_encode 与序列化)

    我需要将多维关联数据数组存储在平面文件中以进行缓存 我偶尔可能会遇到需要将其转换为 JSON 以便在我的 Web 应用程序中使用的情况 但绝大多数时候我会直接在 PHP 中使用该数组 在此文本文件中将数组存储为 JSON 或 PHP 序列化
  • 如何将从 date_parse 返回的日期数组转换回日期字符串

    我有一个由 php 例程 date parse 返回的格式的日期数组 我需要将此日期数组转换回日期字符串 我正在寻找一个与 date parse 例程相反的函数 这是一个接受日期数组作为参数并返回日期字符串的函数 http php net
  • Foreach Ajax Json - Jquery

    谁能帮我 我有一个数组 stars Chris Pine Keira Knightley Kevin Costner 我想做的是 foreach star 我想将输入附加到 div 和 foreach star 它们在输入中具有值 这就是我
  • getappdata 在 MATLAB 中返回空矩阵

    我有一段代码 我在其中使用setappdata然后我使用以下方式调用数据getappdata即使它不为空 它也会返回一个空矩阵 我的一段简化代码如下 function edit1 Callback hObject eventdata han
  • 将数组与其自身连接起来以复制它

    In Python gt gt gt 1 2 3 4 2 1 2 3 4 1 2 3 4 走什么路JavaScript 目前使用 var data 1 2 3 4 data concat data 1 2 3 4 1 2 3 4 JavaS
  • 如何将 numpy rearray 的子集转换为连续数组?

    我有一个recarray来自读取 csv 文件 我有兴趣将列的子集转换为连续浮点数组 我想避免将它们转换为列表或将它们一一堆叠 我尝试了中的建议https stackoverflow com a 11792956 https stackov
  • Python 或 C 语言中的 Matlab / Octave bwdist()

    有谁知道 Matlab Octave bwdist 函数的 Python 替代品 此函数返回给定矩阵的每个单元格到最近的非零单元格的欧几里得距离 我看到了一个 Octave C 实现 一个纯 Matlab 实现 我想知道是否有人必须用 AN
  • reinterpret_cast 到 C 样式数组是非法的 C++11 吗?

    为什么下面的代码不受欢迎 double d 4 0 1 2 3 reinterpret cast
  • 通过嵌套数组对象属性将数组映射到字符串数组

    拥有包含嵌套数组的对象数组 let arr name aaa inputs inputName input 1 groups groupName group a name bbb inputs inputName input 2 group
  • C# Byte[] 转 BCD 和 BCD 转 INT

    我有一个由 CashRegister Machine 创建的 Hex 文件 我必须读入这个文件 文件使用下面详述的格式 它就像套接字数据包 代码数据 2字节PLU 代码数据 7 字节单价数据 5字节数量数据 5字节数据总量 5字节PLU 名
  • 从 MATLAB 调用 Java?

    我想要Matlab程序调用java文件 最好有一个例子 需要考虑三种情况 Java 内置库 也就是说 任何描述的here http docs oracle com javase 6 docs api 这些项目可以直接调用 例如 map ja
  • 在 MATLAB 中模拟 C++ 模板

    我试图找出创建 C 模板或 Java 通用对象的替代方案的最佳方法 出于多种不同的原因 我过去曾多次想这样做 但现在我想做的是为几个相关的类创建 saveobj 和 loadobj 函数 我的想法是 我想要一组通用的例程来创建默认结构 然后
  • 如何使用 Retrofit 解析嵌套 json....?

    我不知道该怎么办使用 Retrofit 解析 json 熟悉使用 Retrofit 解析简单的 json 但不熟悉解析嵌套Json using Retrofit 这是我的 Json 数据 current observation image
  • 异或交换可以扩展到两个以上的变量吗?

    我一直在尝试将异或交换扩展到两个以上的变量 例如n变量 但我没有得到比这更好的地方3 n 1 对于两个整型变量x1 and x2你可以像这样交换它们 swap x1 x2 x1 x1 x2 x2 x1 x2 x1 x1 x2 所以 假设你有

随机推荐