MATLAB中的矩阵数组

use*_*685 39 arrays matlab matrix

我正在寻找一种在MATLAB中将大量可变数量的矩阵存储在数组中的方法.

有没有办法实现这个目标?

例:

for i: 1:unknown
  myArray(i) = zeros(500,800);
end
Run Code Online (Sandbox Code Playgroud)

如果不知道数组的长度是多少,我可以根据需要修改附加信息.

更新:性能是我努力实现这一目标的主要原因.之前它曾将数据作为单个矩阵获取,实时显示,然后继续处理下一组数据.

我尝试使用多维数组,如下面Rocco所建议的那样,但是我的数据太大了以至于我用完了内存,我可能需要针对我的情况寻找另一种选择.当我尝试其他建议时会更新.

更新2:谢谢大家的建议,但是我应该预先指定,精度和速度都是这里的一个不可或缺的因素,在尝试三维数组并重新评估方法之前,我可能需要考虑回到原来的方法.用于导入数据.

Hos*_*Aly 71

使用单元格数组.这比3D阵列具有优势,因为它不需要连续的存储空间来存储所有矩阵.事实上,每个矩阵都可以存储在内存中的不同空间中,如果您的可用内存碎片化,这将使您免于内存不足错误.这是一个在单元格数组中创建矩阵的示例函数:

function result = createArrays(nArrays, arraySize)
    result = cell(1, nArrays);
    for i = 1 : nArrays
        result{i} = zeros(arraySize);
    end
end
Run Code Online (Sandbox Code Playgroud)

要使用它:

myArray = createArrays(requiredNumberOfArrays, [500 800]);
Run Code Online (Sandbox Code Playgroud)

并访问您的元素:

myArray{1}(2,3) = 10;
Run Code Online (Sandbox Code Playgroud)

如果您事先无法知道矩阵的数量,您可以简单地使用MATLAB的动态索引来使阵列尽可能大.性能开销将与单元阵列的大小成比例,并且不受矩阵本身大小的影响.例如:

myArray{1} = zeros(500, 800);
if twoRequired, myArray{2} = zeros(500, 800); end
Run Code Online (Sandbox Code Playgroud)


gno*_*ice 44

如果所有矩阵的大小都相同(即500x800),那么你可以制作一个3D数组:

nUnknown;  % The number of unknown arrays
myArray = zeros(500,800,nUnknown);
Run Code Online (Sandbox Code Playgroud)

要访问一个数组,您将使用以下语法:

subMatrix = myArray(:,:,3);  % Gets the third matrix
Run Code Online (Sandbox Code Playgroud)

您可以通过以下几种方式向myArray添加更多矩阵:

myArray = cat(3,myArray,zeros(500,800));
% OR
myArray(:,:,nUnknown+1) = zeros(500,800);
Run Code Online (Sandbox Code Playgroud)

如果每个矩阵的大小不同,则需要使用像Hosam建议的单元格数组.

编辑:我错过了关于内存耗尽的部分.我猜你的nUnknown相当大.您可能必须切换矩阵的数据类型(如果使用整数,则单个或甚至是uintXX类型).您可以在调用零时执行此操作:

myArray = zeros(500,800,nUnknown,'single');
Run Code Online (Sandbox Code Playgroud)

  • 使用3D阵列的问题在于它需要内存中的连续空间.虽然它可以具有比单元阵列更好的性能,但后者允许在不同的存储空间中分配2D矩阵,因此如果与分段存储器一起使用则更合适. (3认同)