vectorizing 3 nested loops

3 visualizaciones (últimos 30 días)
etudiant_is
etudiant_is el 11 de Mayo de 2016
Editada: Matt J el 11 de Mayo de 2016
Assuming I have the following matrices/vectors
A=[1 3 0
2 0 0
4 5 6];
B=[111
222
333];
C=[10 5 20 25 3 7
1 2 4 6 8 12
11 22 33 44 55 66] ;
I=[0 1 0 0 1 1
1 1 1 1 1 0
0 0 0 0 0 0] ;
D and E are also initialized to 0 before the loops
I have to following 3 nested loops that I want to replace/vectorize. How can I do it?
[nrows, ncols]= size(A);
E=zeros(nnz(A),1);
D=zeros(nnz(A),nrows);
for i = 1:nrows
for j = 1:ncols
if A(i,j)~=0
Id=A(i,j);
E(Id)=C(i,Id)+ B(i);
[p,~] =find(I(:,Id)~=0);
for k=p
D(Id,k)=C(k,Id)+(B(k)+1);
end
else
break
end
end
end
  4 comentarios
Matt J
Matt J el 11 de Mayo de 2016
Are the non-zero values of A always distinct?
etudiant_is
etudiant_is el 11 de Mayo de 2016
Editada: etudiant_is el 11 de Mayo de 2016
yes, they can not be present more than once in A.

Iniciar sesión para comentar.

Respuesta aceptada

Matt J
Matt J el 11 de Mayo de 2016
Editada: Matt J el 11 de Mayo de 2016
[ma,na]=size(A);
nnza=nnz(A);
[mc,nc]=size(C);
[mi,ni]=size(I);
[i,j,Id]=find(A);
k=sub2ind([ma,nc],i,Id);
E=sum(accumarray([i,Id],C(k)+B(i)) ,1).',
IA=bsxfun(@times,I,nonzeros(A).');
[i,j,Id]=find(IA);
k=sub2ind([mi,nc],i,Id);
D=accumarray([i,Id],C(k)+B(i)+1,[ma,nnza]).'

Más respuestas (0)

Categorías

Más información sobre Creating and Concatenating Matrices en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by