Какой самый быстрый способ сравнить векторы из трехмерного массива в Matlab? - PullRequest
0 голосов
/ 12 декабря 2018

Вот мои примеры данных.

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 (4 из значения uint8).Как я могу это сделать?

  2. Мои фактические данные будут Ycoordinate=7000, Xcoordinate=7000, Zdata = 500.Таким образом, это будет около 24 ГБ массива (7000 *7000* 500 = 24 500 000 000 байт). Можно ли найти те же данные Zdata с таким огромным размером массива?

Кроме того, мои данные на самом деле boolean так что это просто 0 или 1, но я не знаю, как выделить только «1 бит (не 1 байт)» для моих данных.

1 Ответ

0 голосов
/ 12 декабря 2018

Код ниже расскажет вам, сколько мест имеют повторяющиеся векторы z-данных.Идея состоит в том, чтобы reshape передать ваши данные в двухмерную матрицу, где каждая строка представляет один столбец z-данных из исходной матрицы.Измененная матрица будет иметь Xcoordinate*Ycoordinate строки и Zdata столбцы.Затем вы можете использовать функцию unique, чтобы получить уникальные строки этой измененной матрицы, которые по существу удаляют любые дублирующиеся векторы z-данных.

Вы также можете заменить вложенный цикл в вашемкод со следующей строкой для прямого генерирования трехмерной случайной матрицы:

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

Если вы хотите сохранить логические данные, используйте logical массивы в MATLAB.

Редактировать: Следуйте приведенным выше комментариям, чтобы уменьшить объем памяти.

Вот код:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...