2015-06-02 3 views
2

Код ниже отлично подходит для небольших векторов.MATLAB - Проблемы с большими массивами

[X1, X2]=meshgrid(Data1(:,1), Data2(:,1)); 
[Y1, Y2]=meshgrid(Data1(:,2), Data2(:,2)); 
[Z1, Z2]=meshgrid(Data1(:,3), Data2(:,3)); 

Rxy = sqrt((X1-X2).^2 + (Y1-Y2).^2); 
Rz = abs(Z1-Z2); 

[I1, I2] =find(Rxy<=100 & Rz<=0.2); 

Однако, поскольку я работаю с большим количеством данных, Matlab не поддерживает и работает неправильно. Matlab генерирует следующее сообщение:

Ошибка с помощью repmat Запрашиваемых 75027x68517 (38.3GB) массива превышает максимального размер массива предпочтения. Создание массивов выше этого предела может занять много времени и привести к тому, что MATLAB перестанет отвечать на запросы. Для получения дополнительной информации см. Панель ограничения размера или панель предпочтений.

Ищет альтернативы ошибке «из памяти», но я не получаю эффективный способ. Я сделал цикл, чтобы функционировать, но он был очень медленным.

+0

Вы используете 64-разрядную систему. – mmoment

+1

Yikes ... этот размер матрицы ОГРОМНЫЙ. Давайте сделаем шаг назад. Можете ли вы объяснить нам, что именно вы пытаетесь сделать? Если мы знаем цель этого кода, тогда мы даже можем предоставить Альтернативы – rayryeng

+0

Да, я использую окна x64. –

ответ

0

Предполагается, что meshgrid использует repmat для создания массивных матриц. Взгляните на bsxfun, разрешая эти типы операций без фактической репликации данных. С помощью:

C = bsxfun (удовольствие, А, Б) применяет бинарную операцию элемента-на-элемент, заданной функция ручка удовольствия от массивов А и В, с одноточечным расширением включено.

Так строка 5 из вашего примера стала бы (непроверенной, не Matlab доступны прямо сейчас:

Rxy = sqrt(bsxfun(@minus, Data1(:,1), Data2(:,1)).^2 + bsxfun(@minus, Data1(:,2), Data2(:,2)).^2); 

и изменить строку ниже аналогично

Смежные вопросы