[已解决] 如何给Cell中的每个元素reshape(不想用for)

[复制链接]
hoop 发表于 2013-10-3 09:48:41
由于我要用eig函数,所以以前数据结构中cell的每个元素是1X9的矩阵,必须reshape成3X3的矩阵,然后使用cellfun就安逸了。

使用for循环,肯定可以。但是由于数据很多,大概10w+个,效率很低。不知道cellfun能支持reshape函数么?

有经验的大大,求助啊!

现在的解决方案是:

for i=1:ngp
        gp_C_cell{i,1} = reshape(gp_C_cell{i,1},3,3)';
end

最佳答案


winner245 发表于 2013-10-3 10:04:06
hoop 发表于 2013-10-3 09:58
一个cell,其中的每个元素都是一个1X9的,现在是想把每个元素reshape成3X3的。
不知大侠有此类经验没? ...

用 cellfun 可以实现, 举个例子把:
  1. A = {rand(1,9),rand(1,9),rand(1,9)}
  2. cellfun(@(x) reshape(x, 3, 3).', A, 'UniformOutput', false)
复制代码

11 条回复


winner245 发表于 2013-10-3 09:53:04
本帖最后由 winner245 于 2013-10-3 09:55 编辑

你的意思是你有很多这样的cell 都需要 reshape成3*3?

hoop 发表于 2013-10-3 09:58:24
winner245 发表于 2013-10-3 09:53
你的意思是你有很多这样的cell 都需要 reshape成3*3?

一个cell,其中的每个元素都是一个1X9的,现在是想把每个元素reshape成3X3的。
不知大侠有此类经验没?

winner245 发表于 2013-10-3 10:04:06
hoop 发表于 2013-10-3 09:58
一个cell,其中的每个元素都是一个1X9的,现在是想把每个元素reshape成3X3的。
不知大侠有此类经验没? ...

用 cellfun 可以实现, 举个例子把:
  1. A = {rand(1,9),rand(1,9),rand(1,9)}
  2. cellfun(@(x) reshape(x, 3, 3).', A, 'UniformOutput', false)
复制代码
回复此楼

hoop 发表于 2013-10-3 10:07:49
winner245 发表于 2013-10-3 10:04
用 cellfun 可以实现, 举个例子把:

感激不尽啊!看来是我没有深挖cellfun的用法!谢谢!:handshake

kaaaf123 发表于 2013-10-3 11:03:43
你这里直接用for也不见得慢(甚至比cellfun),至少我这里测试下来如此
cellfun很多时候只是循环的一种简写方法
另外如果你只计算3*3的特征值应该会有比eig更迅速的方法,毕竟这只是一个很小的矩阵,而且这种方法可能允许你把cell转换成3维矩阵后向量化计算
具体的算法可能需要你自己去查找
不过优化之前要衡量是否值得,如果你只做一次这个运算,或者每次都只要同样的结果(可以把结果保存起来),那么优化这个代码的时间可能比节省的时间要多得多,是否愿意付出这样的代价就要自行斟酌了

hoop 发表于 2013-10-3 17:39:45
kaaaf123 发表于 2013-10-3 11:03
你这里直接用for也不见得慢(甚至比cellfun),至少我这里测试下来如此
cellfun很多时候只是循环的一种简写 ...

谢谢斑竹回复!你说的问题,我发现了,我用for甚至还快过cellfun,可能是cellfun调用了函数句柄。我现在考虑用C-mex来做,比较麻烦,得自己写。

Anyway, 谢谢BZ了!

winner245 发表于 2013-10-3 17:46:56
hoop 发表于 2013-10-3 17:39
谢谢斑竹回复!你说的问题,我发现了,我用for甚至还快过cellfun,可能是cellfun调用了函数句柄。我现在 ...

cellfun 确实未必快过 for,正如版主所说, cellfun 只不过是 for的一种简写方法,本质上也是一个 “循环外壳”,它很多时候都是为了达到代码简化(相对于for而言)的目的

hoop 发表于 2013-10-3 17:55:42
winner245 发表于 2013-10-3 17:46
cellfun 确实未必快过 for,正如版主所说, cellfun 只不过是 for的一种简写方法,本质上也是一个 “循环 ...

嗯,谢谢了!涨姿势了!还有用parfor貌似还慢了些。可能规模小了,不足以体现parfor的性能吧

kaaaf123 发表于 2013-10-3 18:14:15
hoop 发表于 2013-10-3 17:39
谢谢斑竹回复!你说的问题,我发现了,我用for甚至还快过cellfun,可能是cellfun调用了函数句柄。我现在 ...

你如果Parallel Computing Toolbox,并且硬件满足条件,那么可以尝试做GPU并行运算

hoop 发表于 2013-10-3 18:41:11
kaaaf123 发表于 2013-10-3 18:14
你如果Parallel Computing Toolbox,并且硬件满足条件,那么可以尝试做GPU并行运算
...

好的!又得看书了!

s13839165177 发表于 2022-6-20 19:48:49
winner245 发表于 2013-10-3 10:04
用 cellfun 可以实现, 举个例子把:

谢谢大佬!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表