【问题标题】:Converting 2D cell of 2D matrices (consistent sizes) into 4D matlab double将 2D 矩阵(一致大小)的 2D 单元转换为 4D matlab double
【发布时间】:2013-05-02 07:01:59
【问题描述】:

在这里搜索会发现许多问题,如何将双精度元胞数组转换为一个大矩阵。
在我的应用程序中,我有一个二维元胞数组(我们称它为 celldata,大小为 m 乘以 n)所有相同大小的双矩阵(可以说大小为 a 乘以 b)。
我想将该数据结构转换为一位 4D 双精度(mnab)。
目前我这样做是通过

reshape(cat(3,celldata{:}),m,n,a,b)

但也许还有其他方法可以直接做到这一点?也许像这样的电话

cat([3 4],celldata{:,:})

或类似的。

【问题讨论】:

  • 你试过cell2mat了吗?
  • 嗨,丹,是的,我做到了——罗迪也做到了——就像他的回答一样。谢谢。
  • 您对当前解决方案的哪些方面不满意?
  • @DennisJaheruddin 只是认为可能存在一个内置函数可以通过一次调用更快地完成此操作。

标签: arrays matlab double cell reshape


【解决方案1】:

我觉得

cell2mat(permute(celldata, [3 4 1 2]))

会成功的。不过,

%// create some bogus data
m = 1.1e2;
n = 1.2e2;

a = 1.3e2; 
b = 1.4e2;

celldata = cellfun(@(~) randi(10, a,b, 'uint8'), cell(m,n), 'UniformOutput', false);

%// new method
tic
cell2mat(permute(celldata, [3 4 1 2]));
toc

%// your current method
tic
reshape(cat(3,celldata{:}),m,n,a,b);
toc

结果:

Elapsed time is 1.745495 seconds.  % cell2mat/permute
Elapsed time is 0.305368 seconds.  % reshape/cat

cell2mat 是一个 matlab m 文件(由于兼容性问题在循环中具有必要的低效率),而 reshapecat 是内置的。这就是差异的来源。

我会坚持你目前的方法:)

现在,我要问你为什么要首先进行这种转换。是索引问题吗?因为

celldata{x,y}(w,z)  

使您不必进行转换,因此您可以像这样索引

converted_celldata(x,y,w,z)

我没有看到其他原因,因为矩阵/向量运算在 4D 数组上无论如何都不起作用...

【讨论】:

  • 嗨,Rody,特别感谢激活我的大脑,因为存在 permute 的好功能。您的解决方案很有趣,但确实更慢 - 而且并不比我的更漂亮(从我个人的角度来看)。让我们进一步寻找另一种解决方案。
  • @BastianEbeling:我认为没有比您已有的更好/更优雅的方法了。 Matlab 对向量和矩阵有很多操作,一些 用于 3D 数组,但 4D(及更高)需要适用于任意维度数据的方法,就像您已经拥有的那样。
  • @BastianEbeling:查看我的最新编辑,以及最后的问题。
  • 好的,罗迪 - 来回答你的问题:每个矩阵包含属于与单元格数组的列和行相关的元素的特定数据(它是从包含更多不同数据字段的其他单元格生成的类型使单元格使用成为必要)。例如,我想让蜜蜂能够做到sum(converted_celldata,3) 的 4D 表示。
  • @BastianEbeling:很高兴为您提供帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 1970-01-01
相关资源
最近更新 更多