40

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

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

例子:

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

如果数组的不同长度未知,我可以根据需要使用其他信息进行修改。

更新:性能是我试图做到这一点的主要原因。我之前有它,它将数据作为单个矩阵抓取,实时显示,然后继续处理下一组数据。

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

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

4

6 回答 6

72

使用元胞数组。这比 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 的动态索引来使数组尽可能大。性能开销与元胞数组的大小成正比,不受矩阵本身大小的影响。例如:

myArray{1} = zeros(500, 800);
if twoRequired, myArray{2} = zeros(500, 800); end
于 2009-01-21T21:15:25.533 回答
45

如果所有矩阵的大小都相同(即 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');
于 2009-01-21T21:57:48.490 回答
1
myArrayOfMatrices = zeros(unknown,500,800);

如果您的内存不足,请在系统中添加更多 RAM,并确保您运行的是 64 位操作系统。还可以尝试降低你的精度(你真的需要双打还是单打能过得去?):

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

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

myArrayOfMatrices(unknown+1,:,:) = zeros(500,800);
于 2009-01-21T21:55:27.917 回答
0

我正在使用 octave(matlab 克隆)进行一些体积渲染并构建我的 3D 数组(即 2d 切片数组)

buffer=zeros(1,512*512*512,"uint16");
vol=reshape(buffer,512,512,512);

内存消耗似乎是有效的。(对于随后的计算速度不能说同样的话:^)

于 2009-01-21T22:50:52.767 回答
-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

于 2009-01-21T21:17:31.893 回答
-2

就这样做

x=zeros(100,200);
for i=1:100
  for j=1:200
    x(i,j)=input('enter the number');
  end
end
于 2016-06-28T09:18:43.587 回答