在Matlab中比较3D数组向量的最快方法是什么?

时间:2018-12-12 16:26:13

标签: matlab compare bigdata

这是我的示例数据。

Ycoordinate = 10; 
Xcoordinate = 12; 
Zdata = 4; 

my3Darray = zeros(Ycoordinate, Xcoordinate, Zdata);
for i = 1:Ycoordinate
    for j = 1:Xcoordinate
        my3Darray(i,j,:) = uint8(rand(Zdata,1)*64);
    end
end

my3Darray = uint8(my3Darray);

如您所见,有120个位置(Y:10 * X:12),每个位置都有4个uint8值。

这是我的问题。

  1. 我想查找是否有两个或两个以上位置具有相同的Zdata向量(uint8值中的4个)。我该怎么办?

  2. 我的实际数据将是Ycoordinate=7000Xcoordinate=7000Zdata = 500。 因此它将约为24GB阵列(7000 * 7000 * 500 = 24,500,000,000字节) 如此庞大的数组可以找到相同的Zdata吗?

此外,我的数据实际上是boolean,所以它只是01,但我不知道如何为我只分配“ 1位(不是1个字节)”数据。

1 个答案:

答案 0 :(得分:1)

下面的代码将告诉您有多少位置具有重复的z数据向量。想法是将数据reshape放入2D矩阵,其中每一行代表原始矩阵中的z数据的单列。调整后的矩阵将具有Xcoordinate*Ycoordinate行和Zdata列。然后,您可以使用unique函数来获取此重塑矩阵的唯一行,该行实际上会删除所有重复的z数据向量。

您还可以将代码中的嵌套循环替换为以下行,以直接生成3D随机矩阵:

my3Darray = uint8(rand(Ycoordinate, Xcoordinate, Zdata)*64);

如果要存储布尔数据,请在MATLAB中使用logical数组。

编辑:按照上面的烧杯注释进行操作,以减少内存占用。

代码如下:

clear
clc

Ycoordinate = 4000;
Xcoordinate = 4000;
Zdata = 63;

my3Darray = uint8(rand(Ycoordinate,Xcoordinate,Zdata)*64);

%reshape data so that each z-column becomes a row
A = reshape(my3Darray,Ycoordinate*Xcoordinate,Zdata);

[A_unique, I, J] = unique(A,'rows'); %get the unique rows of A

duplicate_count = size(A,1) - size(A_unique,1)