Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在Matlab中存储多个固定大小和数据类型的图像的所有可能和内存有效的方法是什么?_Arrays_Matlab_Memory Management - Fatal编程技术网

Arrays 在Matlab中存储多个固定大小和数据类型的图像的所有可能和内存有效的方法是什么?

Arrays 在Matlab中存储多个固定大小和数据类型的图像的所有可能和内存有效的方法是什么?,arrays,matlab,memory-management,Arrays,Matlab,Memory Management,我试图了解在Matlab中存储相同大小的多个图像的最有效的方法 我在这里写的所有东西都是基于我的一点知识,可能不准确 到目前为止,我知道我们可以读取单元数组、多维数组和结构中的图像 num_imgs = 100; nrow = 512; ncol = 512; cellArray = cell(1,num_imgs); cellArray(1,:) = {zeros(nrow,ncol,'logical')}; threeDArray = zeros(nrow,ncol,num_imgs,'lo

我试图了解在Matlab中存储相同大小的多个图像的最有效的方法

我在这里写的所有东西都是基于我的一点知识,可能不准确

到目前为止,我知道我们可以读取单元数组、多维数组和结构中的图像

num_imgs = 100;
nrow = 512;
ncol = 512;
cellArray = cell(1,num_imgs);
cellArray(1,:) = {zeros(nrow,ncol,'logical')};
threeDArray = zeros(nrow,ncol,num_imgs,'logical');
structArray(1:num_imgs ) = struct('Image', zeros(nrow,ncol,'logical'));

从这个
threeDArray
更好,因为它不需要任何连续数组的指针

然而,
cellArray
是第二好的,因为它只需要为每个额外8字节(即,100*8字节)的数组提供指针

最后,根据每个字段的标记,我认为结构需要多一点

现在,


还有其他可能的方法吗

对于读、写和任何其他影响代码性能的重要参数,哪种方式是最有效的内存方式

我知道单元格有指针,因此
carlarray
中的每个元素不必连续存储在内存中,而
threeDArray
需要连续内存

有人能详细解释一下这种影响绩效的因素吗

cellArray
是第二好的,因为它只需要为每个额外8字节(即,100*8字节)的数组提供指针

事实并非如此。每个数组都有一个“头”(指定其类型、大小等的内存块)。R2017a中的头是104字节(我认为在最新版本中它稍微大一点)。单元阵列包含阵列,因此您在测试中看到的与3D阵列的差异:

26225600 - 26214400 = 11200

单元格数组是指向数组(104字节+任何数据)的指针数组(每个指针8字节)

对于一个相当大的数据块的图像,112字节的开销可以忽略不计。其他考虑因素,如访问速度,变得更加重要

在MATLAB中,两个数组可以指向相同的数据。所以做一些类似于

I = C{4};
不在
C{4}
处创建数组的副本,而是数组
I
引用它。但如果使用三维阵列,则:

I = A(:,:,4);
因为
I
不能引用另一个数组的子集,所以它必须引用整个数组,所以不能进行复制

因此,使用3D阵列处理单个图像需要大量来回复制像素数据,这在单元阵列中是不必要的

结构数组在这里不是一个相关的数据结构,它将等同于单元数组,只是索引更复杂(我不知道这是否转化为运行时增加)。也就是说,
S(4)。Image
C{4}
更复杂。但是,如果要为每个图像存储附加信息,结构数组可能会很有用

正如您所注意到的,struct数组只比cell数组大64字节。这将存储字段名
图像
。再说一次,担心这么大的内存是不值得的

以下是在MATLAB中处理数据的其他方法的简短总结,我认为这些方法都不合理:

  • 自定义对象类型:这里您仍然在处理下面的普通数组,所以这里没有优势或劣势。如果您想添加特定于图像的方法,但不改变处理内存的方式,那么这些类型很好。它们似乎确实增加了一些时间开销

  • 使用,适用于不适合内存的非常大的数据,但我不认为任何人会考虑用这样的数组进行图像分析。

  • 使用,有助于加快文件访问速度,但在这种情况下没有真正的帮助

  • 从MATLAB与Java或Python对话,让他们进行内存处理。但是,您也可以完全跳过MATLAB,转到另一个环境

因此,我真的认为处理多个图像的两个有意义的选项是单元格数组(或其他异构容器,如结构或自定义对象)或3D数组。我不会考虑任何其他事情。


总之:使用单元格数组。

相关信息:(不是重复的!)谢谢。我还认为细胞阵列很好。引用特性非常有趣。假设我做了类似于
i=C{4}
,然后更改i,
i=one(nrow,ncol,'logical')
。现在将创建一个
I
的副本,对吗?@Gopi:如果您创建了
I=ones(…)
,那么您将创建一个新数组,旧数组不会被复制。但是如果你做了
I(1)=0
,那么将制作一份副本。引用是一个“延迟复制”,MATLAB假装它们是不同的数组,因此修改一个数组并不意味着修改另一个数组。@Gopi:这个答案有一些关于延迟复制机制的引用:。是否有其他可能的方法来存储多个图像。我只想做个实验,看看他们是怎么做的work@Gopi:对不起,我忘了回答你问题的那一部分。我在底部添加了一段来解决这个问题。
I = C{4};
I = A(:,:,4);