kron on distributed arrays ?

2 次查看(过去 30 天)
Hugo
Hugo 2014-2-3
回答: Hugo 2014-2-5
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 个评论
Walter Roberson
Walter Roberson 2014-2-4
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 2014-2-4
I'm actually using kron as a tensor product not to replicate.

请先登录,再进行评论。

采纳的回答

Hugo
Hugo 2014-2-4
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 个评论
Hugo
Hugo 2014-2-5
编辑:Hugo 2014-2-5
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 2014-2-5
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.

请先登录,再进行评论。

更多回答(1 个)

Hugo
Hugo 2014-2-5
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

类别

Help CenterFile Exchange 中查找有关 Matrices and Arrays 的更多信息

产品

Community Treasure Hunt

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

Start Hunting!

Translated by