首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab三维矩阵

Matlab三维矩阵
EN

Stack Overflow用户
提问于 2012-09-28 23:50:46
回答 2查看 2.4K关注 0票数 7

我必须创建一个非常大的3D矩阵(例如:500000x60x60)。有没有办法在matlab中做到这一点?

当我尝试的时候

代码语言:javascript
复制
omega = zeros(500000,60,60,'single');

我得到一个out-of-memory错误。

稀疏函数是没有选项的,因为它只适用于2D矩阵。那么,对于高维矩阵,有没有什么替代方法呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-29 01:56:04

Matlab仅支持稀疏矩阵(2D)。对于3D张量/数组,您必须使用变通方法。我能想到两个:

  1. linear indexing
  2. 单元阵列

线性索引

可以创建稀疏向量,如下所示:

代码语言:javascript
复制
A = spalloc(500000*60*60, 1, 100); 

其中最后一项(100)指的是最终分配给A的非零数。如果您事先知道这个数量,那么A的内存使用效率会更高。如果你事先不知道,只需使用一些接近它的数字,它仍然可以工作,但A最终会消耗比它严格需要的更多的内存。

然后,您可以像引用3D数组一样引用元素,如下所示:

代码语言:javascript
复制
A(sub2ind(size(A), i,j,k)) 

其中ijk分别是1维、2维和3维的索引。

单元格阵列

将3D张量/数组中的每个2D页面创建为一个单元数组:

代码语言:javascript
复制
a = cellfun(@(x) spalloc(500000, 60, 100), cell(60,1), 'UniformOutput', false);

同样的故事也适用于spalloc的最后一个条目。然后在3D中连接,如下所示:

代码语言:javascript
复制
A = cat(3, a{:});

然后,您可以像这样引用单个元素:

代码语言:javascript
复制
A{i,j,k}

其中ijk分别是1维、2维和3维的索引。

票数 8
EN

Stack Overflow用户

发布于 2012-09-29 01:15:00

由于您的矩阵是稀疏的,请尝试使用ndsparse (N维稀疏数组FEX)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12643279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档