Merge of Matrices 2
- To: mathgroup at smc.vnet.net
- Subject: [mg71198] Merge of Matrices 2
- From: Oliver Ruebenkoenig <ruebenko at uni-freiburg.de>
- Date: Fri, 10 Nov 2006 06:37:58 -0500 (EST)
- References: <eisglr$nf9$1@smc.vnet.net> <eiush7$gs5$1@smc.vnet.net>
Hi,
> LinearAlgebra`MatrixManipulation`BlockMatrix[]
>
> does not help ??
No. Not always that is.
In[1]:= n = 5;
In[2]:= a = b = c = d = SparseArray[ {i_, i_} :> i, {n, n} ];
In[3]:= << LinearAlgebra`MatrixManipulation`
In[4]:= res = BlockMatrix[ {{a, b}, {c, d}} ]
Out[4]=
{SparseArray[<2>, {10}], SparseArray[<2>, {10}], SparseArray[<2>, {10}],
> SparseArray[<2>, {10}], SparseArray[<2>, {10}], SparseArray[<2>,
{10}],
> SparseArray[<2>, {10}], SparseArray[<2>, {10}], SparseArray[<2>,
{10}],
> SparseArray[<2>, {10}]}
Hm, that is not what I would have expected to happen, OK, nevertheless
n[5]:= res2 = SparseArray[ res ]
Out[5]=
SparseArray[<20>, {10, 10}]
fixes this issue.
if we now increase n
n[6]:= n = 5000;
In[7]:= a = b = c = d = SparseArray[ {i_, i_} :> i, {n, n} ];
In[8]:= Timing[ res = BlockMatrix[ {{a, b}, {c, d}} ]; ]
Out[8]=
{0.176011 Second, Null}
In[9]:= Timing[ res2 = SparseArray[ res ] ]
Out[9]=
{0.988062 Second, SparseArray[<20000>, {10000, 10000}]}
Hm, also not overwhelming. if we further increase n
In[14]:= n = 50000;
In[15]:= a = b = c = d = SparseArray[ {i_, i_} :> i, {n, n} ];
In[16]:= res = BlockMatrix[ {{a, b}, {c, d}} ];
SparseArray::ntb:
Cannot convert the sparse array SparseArray[<50000>, {50000, 50000}]
to an ordinary array because the 2500000000
elements required exceeds the current size limit.
Out[16]=
Hold[SystemException[SparseArrayNormalLimit,
> Normal[SparseArray[<50000>, {50000, 50000}]]],
> SystemException[SparseArrayNormalLimit,
> Normal[SparseArray[<50000>, {50000, 50000}]]]]
it fails.
If you look into the code it is clear why this happens. So I think if you
use SparseArrays avoid BlockMatrix. Too slow and breaks. I think Bill Rows
approach is nice. If you have storage problems, you might want to use a
Table command and delete the old sub matrix. Something like
stiffness = SparseArray[ {}, { 3 numberOfNodes, 3 numberOfNodes } ];
Table[ stiffness[[ Range[ (i - 1) numberOfNodes + 1, i numberOfNodes ],
Range[ (j - 1) numberOfNodes + 1, j numberOfNodes ] ]] =
sparseArrays[[ i, j ]]; sparseArray[[i,j]]={};, { i, dimensions }, {
j, dimensions } ];
is sparseArrays is something like {{a,b},{c,d}}
HTH,
Oliver
Oliver Ruebenkoenig, <ruebenko at uni-freiburg.de>
Phone: ++49 +761 203 7388