Любые советы по эффективному и быстрому удалению данной строки/столбца из матрицы?Эффективное удаление матричных строк/столбцов в 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 с одинаково хорошим качеством?
Спасибо!
Да, производительность, которую я надеялся получить с помощью mxSetN, заключалась в том, что она просто проигнорировала бы этот последний столбец и эффективно удалила бы его; что, по-видимому, указывает автор. К сожалению, это не сработало с моей стороны. В конечном счете, я думаю, что лучший способ сделать это может быть просто 'java.util.ArrayList'. – genap
Ну, вы можете использовать этот подход с помощью mxSetN, и он это сделает. Он не будет удалять его до тех пор, пока mxArray не будет очищен, но MATLAB будет обрабатывать массив, как если бы он имел меньше столбца. Что не сработало? Вы сказали, что не можете заставить его работать - в чем проблема? – CKT