large 3D Matrix calculation

Hi All I have two large matrix and I want to calculate an expression without for loop. this expression is something like matrix d as below
f=[f1 f2 f3]
r=[r1 r2 r3]
d=[f1-r1 f2-r1 f3-r1
f1-r2 f2-r2 f3-r2
f1-r3 f2-r2 f3-r3]
can any one help me?! consider that size(f)=1*1*400 and size(r)=50*50*900 and fii=f(1,1,ii) and rjj=r(:,:,jj)

 Risposta accettata

Stephen23
Stephen23 il 20 Gen 2015
Modificato: Stephen23 il 21 Gen 2015
You gave this code in a comment to my other answer:
size(f)==[1,350]
size(r)==[50,50,900]
for ii=1:350
for jj=1:900
s(ii,jj) = sum(sum(sum( repmat(f(ii),[50,50,1]) - r(:,:,jj) ))) ;
end
end
You can try this instead:
A = 50*50*reshape(f,1,[]);
B = reshape(sum(sum(r,1),2),[],1);
C = bsxfun(@minus,A,B);
It produces the same result as your nested loops.

1 Commento

rahman
rahman il 25 Gen 2015
tnx Stephen Cobeldick. your code was completely helpfull ;)

Accedi per commentare.

Più risposte (2)

Stephen23
Stephen23 il 20 Gen 2015
Modificato: Stephen23 il 20 Gen 2015
This is exactly what bsxfun is for:
f = [f1,f2,f3];
r = [r1,r2,r3];
d = bsxfun(@minus,f,r.');
bsxfun calculates the output without requiring large intermediate arrays (eg using repmat). Although, depending on the size of d, you might still run out of memory...

3 Commenti

rahman
rahman il 20 Gen 2015
Modificato: rahman il 20 Gen 2015
Dear friends let me say exactly what I need ! suppose that size(f) = 1*350 ; size(r)=50*50*900; I want to calculate the S matrix as below
for ii=1:350
for jj=1:900
s(ii,jj) = sum(sum(sum( repmat(f(ii),[50,50,1]) - r(:,:,jj) ))) ;
end
end
Now, I want to calculate this matrix without for loops and by faster matrix calculation method !
Stephen23
Stephen23 il 20 Gen 2015
Modificato: Stephen23 il 20 Gen 2015
What you have now described is a different problem to the one that you posed in your original question. My code exactly solves your original question.
The heartache of those who write code - shifting specs. The correct answer to the question asked but not the question intended. :)

Accedi per commentare.

dpb
dpb il 20 Gen 2015
d=repmat(f,size(r,2),1).-repmat(r.',1,size(f,2));

1 Commento

rahman
rahman il 20 Gen 2015
tnx dpb but this operation needs much RAMs according to what I said ( consider that size(f)=1*1*400 and size(r)=50*50*900 and fii=f(1,1,ii) and rjj=r(:,:,jj) )

Accedi per commentare.

Categorie

Scopri di più su Loops and Conditional Statements in Centro assistenza e File Exchange

Richiesto:

il 20 Gen 2015

Commentato:

il 25 Gen 2015

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by