2016-06-15 4 views
0

Любые советы по эффективному и быстрому удалению данной строки/столбца из матрицы?Эффективное удаление матричных строк/столбцов в MATLAB

Первоначально я считал, что удаление последнего столбца данной матрицы будет более эффективным, чем первый столбец, и все операции с столбцами будут более эффективными, чем операции с строками (учитывая память на основе столбцов MATLAB), которые я смог подтвердить через тестирование. Однако производительность, которую я получил, была довольно неудачной.

someB = rand(4,50000); 
someC = someB.'; 

tic 
while size(someB,2) > 2 
    someB(:,size(someB,2)) = []; 
end 
toc 

tic 
while size(someC,1) > 2 
    someC(size(someC,1),:) = []; 
end 
toc 

%Elapsed time is 13.869280 seconds. 
%Elapsed time is 10.198270 seconds. 

Я сделал быстрый поиск и this MATLAB newsgroup discussion я нашел надежду, что с помощью внешних функций C MEX может действительно быть способом эффективно удалить последний столбец матрицы быстро. Код прилагается ниже.

#include "mex.h" 

// You may need to uncomment the next line 
//#define mwSize int 

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) 
{ 
    mwSize n; 
    if(n = mxGetN(prhs[0])) 
     mxSetN(prhs[0], n - 1); 
} 

Тем не менее, я не смог получить код, который работает сам. Если вы быстро просмотрите результаты, найденные автором, вы найдете довольно замечательную производительность. Я не так хорошо разбираюсь в MEX; кто-нибудь знает, как исправить выше код так, чтобы он работал, или, альтернативно, иметь одинаково хороший код MEX/MATLAB с одинаково хорошим качеством?

Спасибо!

ответ

0

Ну, например, решение MEX, которое вы разместили, фактически не является , удаляя столбец, поэтому это не очень хорошее сравнение. Решение с использованием «mxSetN» просто устанавливает внутренний заголовок для mxArray, чтобы думать, что он имеет N столбцов. Из документации:

Обычно вы используете mxSetN для изменения формы существующего mxArray. Функция mxSetN не выделяет и не освобождает место для массивов pr, pi, ir или jc.

Что касается результатов синхронизации, которые вы видите, что произойдет, если вы запустите это несколько раз? В первый раз, когда я запустил это, у меня были похожие результаты, но во втором режиме тайминги были одинаковыми для обоих методов.

Имейте в виду, что в любом случае вам необходимо перераспределить большой объем памяти, поскольку вы удаляете только 4 элемента за раз. Это означает, что более ранние итерации цикла будут стоить вам больше, чем более поздние итерации.

Большой вопрос: вот что вы в конечном итоге пытаетесь сделать. Возможно, вы можете избежать удаления и просто использовать часть необходимой вам матрицы, или, возможно, есть способ избежать необходимости удалять один столбец на каждой итерации (а вместо этого делать несколько столбцов).

+0

Да, производительность, которую я надеялся получить с помощью mxSetN, заключалась в том, что она просто проигнорировала бы этот последний столбец и эффективно удалила бы его; что, по-видимому, указывает автор. К сожалению, это не сработало с моей стороны. В конечном счете, я думаю, что лучший способ сделать это может быть просто 'java.util.ArrayList'. – genap

+0

Ну, вы можете использовать этот подход с помощью mxSetN, и он это сделает. Он не будет удалять его до тех пор, пока mxArray не будет очищен, но MATLAB будет обрабатывать массив, как если бы он имел меньше столбца. Что не сработало? Вы сказали, что не можете заставить его работать - в чем проблема? – CKT

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