我正在寻找一种在MATLAB中将大量可变数量的矩阵存储在数组中的方法。
有没有办法实现这个目标?
示例:
for i: 1:unknown
myArray(i) = zeros(500,800);
end
如果不知道数组的长度是多少,我可以根据需要修改附加信息。
更新: 性能是我努力实现这一目标的主要原因。之前它曾将数据作为单个矩阵抓取,实时显示,然后继续处理下一组数据。
我尝试使用多维数组,如下面Rocco所建议的那样,但是我的数据太大以至于我的内存不足,我可能需要为我的情况寻找另一种选择。当我尝试其他建议时会更新。
更新2: 谢谢大家的建议,但是我应该预先指定,精度和速度都是这里的一个不可或缺的因素,在尝试三维数组并重新评估导入方法之前,我可能需要考虑回到原来的方法。数据
答案 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以来已经有一段时间了。 所以这个页面可能会对这个问题有所了解:
答案 5 :(得分:-2)
就像这样做
x=zeros(100,200);
for i=1:100
for j=1:200
x(i,j)=input('enter the number');
end
end