kron on distributed arrays ?

2 Ansichten (letzte 30 Tage)
Hugo
Hugo am 3 Feb. 2014
Beantwortet: Hugo am 5 Feb. 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 Kommentare
Walter Roberson
Walter Roberson am 4 Feb. 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 am 4 Feb. 2014
I'm actually using kron as a tensor product not to replicate.

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Hugo
Hugo am 4 Feb. 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 Kommentare
Hugo
Hugo am 5 Feb. 2014
Bearbeitet: Hugo am 5 Feb. 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 am 5 Feb. 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.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Hugo
Hugo am 5 Feb. 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

Produkte

Community Treasure Hunt

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

Start Hunting!

Translated by