MATLAB中的矩阵数组

时间:2009-01-21 20:59:55

标签: arrays matlab matrix

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

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

示例:

for i: 1:unknown
  myArray(i) = zeros(500,800);
end

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

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

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

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

6 个答案:

答案 0 :(得分:68)

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

function result = createArrays(nArrays, arraySize)
    result = cell(1, nArrays);
    for i = 1 : nArrays
        result{i} = zeros(arraySize);
    end
end

使用它:

myArray = createArrays(requiredNumberOfArrays, [500 800]);

并访问您的元素:

myArray{1}(2,3) = 10;

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

myArray{1} = zeros(500, 800);
if twoRequired, myArray{2} = zeros(500, 800); end

答案 1 :(得分:41)

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

nUnknown;  % The number of unknown arrays
myArray = zeros(500,800,nUnknown);

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

subMatrix = myArray(:,:,3);  % Gets the third matrix

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

myArray = cat(3,myArray,zeros(500,800));
% OR
myArray(:,:,nUnknown+1) = zeros(500,800);

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

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

myArray = zeros(500,800,nUnknown,'single');

答案 2 :(得分:1)

myArrayOfMatrices = zeros(unknown,500,800);

如果内存不足会在系统中丢失更多RAM,并确保运行的是64位操作系统。还要尝试降低你的精确度(你真的需要双打,还是单打?):

myArrayOfMatrices = zeros(unknown,500,800,'single');

要附加到该数组,请尝试:

myArrayOfMatrices(unknown+1,:,:) = zeros(500,800);

答案 3 :(得分:0)

我正在使用octave(matlab clone)进行一些体积渲染,并使用

构建我的3D数组(即2d切片数组)
buffer=zeros(1,512*512*512,"uint16");
vol=reshape(buffer,512,512,512);

内存消耗似乎很有效。 (不能说随后的计算速度相同:^)

答案 4 :(得分:-2)

如果你知道什么是未知的,

你可以做点什么

myArray = zeros(2,2);
for i: 1:unknown
  myArray(:,i) = zeros(x,y);
end

然而,自从我上次使用matlab以来已经有一段时间了。 所以这个页面可能会对这个问题有所了解:

http://www.mathworks.com/access/helpdesk/help/techdoc/index.html?/access/helpdesk/help/techdoc/matlab_prog/f1-86528.html

答案 5 :(得分:-2)

就像这样做

x=zeros(100,200);
for i=1:100
  for j=1:200
    x(i,j)=input('enter the number');
  end
end