how to build a 3d sparse matrix?

Hi everyone: As we all know these has a sparse function in matlab, for example, there has two vector:
a = [1 2 3 1 5]; b=[1 2 4 1 6];
if I use spase function like this as follow:
sn = sparse(a,b,1);
It will shows the answer like this:
ans =
(1,1) 2
(2,2) 1
(3,4) 1
(5,6) 1
the third column means the count number of conresponding row and column in a and b. So my qusetion is if it is possible to build a 3d sparse matrix as the extend of the trandtional sparse function as follow: if there has two vector:
aa = [1 2 1 1 2 3]; bb=[1 2 1 1 2 4];cc=[1 2 1 1 2 5];
snn = sparse_3d(aa,bb,cc,1);
snn=
(1, 1, 1) 3
(2, 2, 2) 2
(3, 4, 5) 1
That is very nice of anyone can give me the answer. Thanks ahead! weihua

 Réponse acceptée

Matt J
Matt J le 27 Août 2015
Modifié(e) : Matt J le 27 Août 2015

3 votes

You could try my ndSparse class ( Download ),
>> snn = ndSparse.build([aa',bb',cc'],1)
snn(:,:,1) =
(1,1) 3
snn(:,:,2) =
(2,2) 2
snn(:,:,5) =
(3,4) 1

3 commentaires

Hi Matt, I've been trying your ndSparse class, but I'm not sure what the proper way of use is.
In my case I want to use a 3 dimensional sparse, of which two dimensions define a geometric object, the 3rd dimension is for time.
Beforehand I know the size of the 3 dimensions, and an estimate of the number of non-zero elements, so I can use spalloc to pre-allocate the ndSparse object:
AllResults = ndSparse.spalloc([numel(x_vector),numel(y_vector),numel(time)],NNZestimate);
Next, I use normal indexing of the AllResults object as I would do with a 3d-vector, to assign the results of each time step. Before I do that, I place the results in a sparse:
for t = 1:numel(time)
....somecalculations...
AllResults(:,:,t) = sparse(xindices,yindices,aboveresults,numel(x_vector),numel(y_vector));
end
Is this the correct way to work with ndSparse objects?
Matt J
Matt J le 6 Déc 2018
Modifié(e) : Matt J le 6 Déc 2018
You can do that, but the more efficient way is to use ndSparse.build,
T=numel(time);
X=numel(x_vector);
Y=numel(y_vector);
coordinates=cell(T,1);
values=cell(T,1);
for t = 1:T
....somecalculations...
coordinates{t}=[xindices(:), yindices(:), xindices(:)*0+t];
values{t}=aboveresults(:);
end
coordinates=cell2mat(coordinates);
values=cell2mat(values);
AllResults = ndSparse.build(coordinates,values,[X,Y,T],NNZestimate);
Lucademicus
Lucademicus le 7 Déc 2018
Modifié(e) : Lucademicus le 7 Déc 2018
Thank you for the suggestion, it greatly reduced the computational time!

Connectez-vous pour commenter.

Plus de réponses (1)

Steven Lord
Steven Lord le 27 Août 2015

1 vote

No, sparse matrices are limited to 2 dimensions. If you feel strongly that MATLAB should extend sparse matrices to 3 or more dimensions, please send your use case (how you would use those higher dimensional sparse arrays) to Technical Support and ask them to include that information in the enhancement database.

Catégories

Community Treasure Hunt

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

Start Hunting!

Translated by