kron on distributed arrays ?

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 Comments

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 ?
I'm actually using kron as a tensor product not to replicate.

Sign in to comment.

 Accepted Answer

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 Comments

In the first version the inputs to sparse are vectors. In the second version the appearance is that the bsxfun are likely to produce 2D arrays and use those as input to sparse.
Hugo
Hugo on 5 Feb 2014
Edited: Hugo on 5 Feb 2014
That's a good clue indeed, thanks. So the question is why distributed array don't accept such input to sparse ?
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.

Sign in to comment.

More Answers (1)

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

Categories

Products

Asked:

on 3 Feb 2014

Answered:

on 5 Feb 2014

Community Treasure Hunt

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

Start Hunting!