How to compile large matrix
Afficher commentaires plus anciens
Hello!
I am trying compile a matrix with one row and a large number of columns (matrix A). I have a problem with compiling matrix A, which contains only three different values, as an example
A = [a,b,c,a,b,c,a,b,c,...]
and so on. I tried with repmat command, but because there is a lot of data (size of matrix A is 1x600.000 or with even more columns), Matlab needs to a lot of time to calculate.
I need this matrix in for loop to multiply it with another matrix (matrix B), which has a large number or rows and only 4 columns. I have compile matrix B in for loop.
Below there is a matlab code I have use.
Thank you in advance for all the answers. Tamara
%data = matrix with 3 columns and a lot of rows (the number of rows varies according to the number of scanned points, number of columns is always the same, xyz coordinate)
%plane_par = matrix with 1 column and 4 rows (size is always the same, they are plane parameters)
size_data = size(data);
size_repmat = size_data(1,1);
Adel = [plane_par(1,1), plane_par(2,1), plane_par(3,1)];
A = repmat(Adel,1,size_repmat);
for i = 1:size(data,1)
B = [data(i,1), data(i,2), data(i,3), 1];
f = [-plane_par(1,1)*data(i,1)-plane_par(2,1)*data(i,2)-plane_par(3,1)*data(i,3)+plane_par(4,1)];
delta = pinv(B'*pinv(A*A')*B)*(B'*pinv(A*A')*f);
end
3 commentaires
per isakson
le 5 Jan 2019
Modifié(e) : per isakson
le 5 Jan 2019
"lot of time" how much is that?
>> tic, M = repmat( [1,2,3], 1, 6e5 ); toc
Elapsed time is 0.003957 seconds.
>> tic, M = repmat( {'a','b','c'}, 1, 6e5 ); toc
Elapsed time is 0.034483 seconds.
btw: do a, b, c stand for numbers?
Tamara Znidarsic
le 5 Jan 2019
per isakson
le 5 Jan 2019
Modifié(e) : per isakson
le 5 Jan 2019
Note that delta is overwritten inside the loop.
Break out pinv(A*A') from the expression, pinv(B'*pinv(A*A')*B)*(B'*pinv(A*A')*f) and calculate it outside the loop. A doesn't change in the loop.
Réponses (1)
Andrei Bobrov
le 5 Jan 2019
Modifié(e) : Andrei Bobrov
le 5 Jan 2019
for your case:
s = size(data,1);
B = [data,ones(s,1)]';
BB = permute(B,[3,1,2]).*permute(B,[1,3,2]);
f = B.*(B'*(plane_par.*[-1;-1;-1;1]))';
delta = zeros(4,s);
for ii = 1:s
delta(:,ii) = pinv(BB(:,:,ii))*f(:,ii);
end
Catégories
En savoir plus sur Loops and Conditional Statements dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!