我需要使用4维矩阵作为累加器来投票4个参数。每个参数在1~300范围内变化。为此,我在MATLAB中定义了Acc =零(300,300,300,300)。以及某处,例如,我用过:
Acc(4,10,120,78)=Acc(4,10,120,78)+1
然而,MATLAB表示由于内存限制而发生了一些错误。
??? Error using ==> zeros
Out of memory. Type HELP MEMORY for your options.
中,您可以看到我的代码的一部分:
I = imread('image.bmp'); %I is logical 300x300 image.
Acc = zeros(100,100,100,100);
for i = 1:300
for j = 1:300
if I(i,j)==1
for x0 = 3:3:300
for y0 = 3:3:300
for a = 3:3:300
b = abs(j-y0)/sqrt(1-((i-x0)^2) / (a^2));
b1=floor(b/3);
if b1==0
b1=1;
end
a1=ceil(a/3);
Acc(x0/3,y0/3,a1,b1) = Acc(x0/3,y0/3,a1,b1)+1;
end
end
end
end
end
end
答案 0 :(得分:1)
正如@Rasman所提到的,你可能想要使用矩阵Acc。
的稀疏表示不幸的是,sparse
函数适用于2D矩阵,而非任意n-D。
但是没关系,因为我们可以利用sub2ind
和线性索引来回到4D。
Dims = [300, 300, 300, 300]; % it will be a 300 by 300 by 300 by 300 matrix
Acc = sparse([], [], [], prod(Dims), 1, ExpectedNumElts);
此处ExpectedNumElts
应该是某些数字,例如30或9000,或者您希望矩阵Acc
有多少非零元素。我们在概念上将Acc
视为矩阵,但实际上它将是一个向量。但是没关系,我们可以使用sub2ind
将4D坐标转换为线性索引到矢量中:
ind = sub2ind(Dims, 4, 10, 120, 78);
Acc(ind) = Acc(ind) + 1;
您还可以找到有用的功能find
,nnz
,spy
和spfun
。
答案 1 :(得分:0)
请参阅Avoiding 'Out of Memory' Errors
您的陈述需要超过4 GB的RAM(大约16 Gigs,具体而言)。
“内存不足”问题的解决方案 分为两大类:
最大化可用内存 MATLAB(即删除或增加 限制)通过操作系统 系统选择和系统 组态。这些通常都有 最大的整体适用性但是 可能是最具破坏性的(例如 使用不同的操作系统)。 这些技术包括在内 本文件的前两部分。
最小化MATLAB使用的内存 通过使您的代码更多的内存 高效。这些都是算法 和具体的应用程序 不太广泛适用。这些 技术将在稍后介绍 本文档的各个部分。
在您的情况下,以后似乎是解决方案 - 尝试减少使用/需要的内存量。
答案 2 :(得分:0)
编辑:看一下lambdageek完全相同的答案,更加优雅。
其他答案有助于指导您使用稀疏垫而不是当前的密集解决方案。由于当前的matlab不支持N维稀疏数组,因此这有点困难。执行此操作的一个实现是
替换
zeros(100,100,100,100)
与
sparse(100*100*100*100,1)
这会将所有计数存储在一个稀疏数组中,只要大多数保持为零,你就可以获得内存。
然后访问此数据,而不是:
Acc(h,i,j,k)=Acc(h,i,j,k)+1
使用:
index = h+100*i+100*100*j+100*100*100*k
Acc(index,1)=Acc(index,1)+1