kron on distributed arrays ?

2 vues (au cours des 30 derniers jours)
Hugo
Hugo le 3 Fév 2014
Réponse apportée : Hugo le 5 Fév 2014
Hi everyone, I need to perform Kronecker products on (sparse) distributed arrays however the kron function is unfortunately not handled. I tried to edit the Matlab function and it appears that only the last line:
K = sparse(ik,jk,bsxfun(@times,sb,sa.'),ma*mb,na*nb);
produces an issue within an spdm loop
Any clue about how to overcome this? The error message is:
Error detected on lab(s) 1 2.
Caused by:
Error using codistributed/sparse>iCallSparseImpl (line 122)
Operands to the || and && operators must be convertible to logical scalar values.
Operands to the || and && operators must be convertible to logical scalar values.
Error using codistributed/sparse>iCallSparseImpl (line 122)
Operands to the || and && operators must be convertible to logical scalar values.
Operands to the || and && operators must be convertible to logical scalar values.
--
Thanks in advance
  2 commentaires
Walter Roberson
Walter Roberson le 4 Fév 2014
When you use kron, are you doing no-trivial multiplications with it, or are you using it for its "replicate" behavior, where one of the arrays has only 0 and 1 entries ?
Hugo
Hugo le 4 Fév 2014
I'm actually using kron as a tensor product not to replicate.

Connectez-vous pour commenter.

Réponse acceptée

Hugo
Hugo le 4 Fév 2014
The following code seems to work like a charm producing a distributed output:
S = speye(10);
S = distributed(S);
[i,j,s] = find(S);
[m,n] = size(S);
S = sparse(i,j,s,m,n);
whos
While this one (from kron function) doesn't:
A=speye(10);
B=speye(10);
A=distributed(A);
B=distributed(B);
[ma,na] = size(A);
[mb,nb] = size(B);
[ia,ja,sa] = find(A);
[ib,jb,sb] = find(B);
ia = ia(:); ja = ja(:); sa = sa(:);
ib = ib(:); jb = jb(:); sb = sb(:);
ik = bsxfun(@plus, mb*(ia-1).', ib);
jk = bsxfun(@plus, nb*(ja-1).', jb);
sk = bsxfun(@times,sb,sa.');
whos
K = sparse(ik,jk,sk,ma*mb,na*nb);
Altough the inputs to sparse in both case are of the same nature somethiong I'm really missing here.
  3 commentaires
Hugo
Hugo le 5 Fév 2014
Modifié(e) : Hugo le 5 Fév 2014
That's a good clue indeed, thanks. So the question is why distributed array don't accept such input to sparse ?
Walter Roberson
Walter Roberson le 5 Fév 2014
If, hypothetically, the code had something like,
if ~any(ColIdx) && ~any(RowIdx)
then that would work for vectors because the any() would reduce the vectors to scalars, but it would fail for 2D arrays because you would be left with vectors connected by &&
You would need to look at codistributed/sparse>iCallSparseImpl (line 122) to see what the actual code is; I do not have that toolbox. The documentation for sparse() does say "vectors" in the positions.

Connectez-vous pour commenter.

Plus de réponses (1)

Hugo
Hugo le 5 Fév 2014
I managed to overcome the issue rewriting the kron function which body reads
[ma,na] = size(A);
[mb,nb] = size(B);
[ia,ja,sa] = find(A);
[ib,jb,sb] = find(B);
ia = ia(:); ja = ja(:); sa = sa(:);
ib = ib(:); jb = jb(:); sb = sb(:);
ik = bsxfun(@plus, mb*(ia-1).', ib);
jk = bsxfun(@plus, nb*(ja-1).', jb);
sk = bsxfun(@times,sb,sa.');
ik=reshape(ik,numel(ik),1); % added
jk=reshape(jk,numel(jk),1); % added
sk=reshape(sk,numel(sk),1); % added
K = sparse(ik,jk,sk,ma*mb,na*nb);
To summarize matrix input to sparse is handled for regular data but not for distributed ones.
Special thank to Walter that noticed about the matrix nature of ik, jk and sk

Catégories

En savoir plus sur Logical dans Help Center et File Exchange

Produits

Community Treasure Hunt

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

Start Hunting!

Translated by