4维矩阵

时间:2011-06-15 14:49:14

标签: matlab

我需要使用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

3 个答案:

答案 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;

您还可以找到有用的功能findnnzspyspfun

答案 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