Partitioning a vector of doubles into cells using a second vector to index

2 visualizaciones (últimos 30 días)
Hi all,
I would like to partition a vector of numbers into separate sub-cells, using a second vector as a list of indices. See the example below:
vectorContents = 1:5;
indexingVector = [1 1 1 2 2];
I'd like the output to be a cell array that looks like
storeCell = {[1 1 1],[2 2]}
Is there a way to achieve this using deal and other parallelized functions to avoid a for loop? My current implementation looks like this:
vectorContents = 1:5;
indexingVector = [1 1 1 2 2];
uniqueInds = unique(indexingVector);
storeCell = cell(numel(uniqueInds),1);
for ii = 1:numel(uniqueInds)
currInd = uniqueInds(ii);
currLogic = indexingVector == currInd;
storeCell{ii} = vectorContents(currLogic);
end
Thanks in advance!

Respuesta aceptada

Stephen23
Stephen23 el 17 de Oct. de 2024
Editada: Stephen23 el 17 de Oct. de 2024
V = 1:5;
X = [1,1,1,2,2];
C = accumarray(X(:),V(:),[],@(v){v.'})
C = 2x1 cell array
{[1 2 3]} {[ 4 5]}
or
C = groupsummary(V(:),X(:),@(v){v.'})
C = 2x1 cell array
{[1 2 3]} {[ 4 5]}
or
C = arrayfun(@(n)V(n==X),1:max(X),'Uni',0) % probably the slowest
C = 1x2 cell array
{[1 2 3]} {[4 5]}

Más respuestas (1)

Pavl M.
Pavl M. el 17 de Oct. de 2024
Editada: Pavl M. el 17 de Oct. de 2024
clc
clear all
close all
vectorContents = 1:7
vectorContents = 1×7
1 2 3 4 5 6 7
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
indexingVector = [1 1 1 2 2 3 3]
indexingVector = 1×7
1 1 1 2 2 3 3
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
uniqueInds = unique(indexingVector)
uniqueInds = 1×3
1 2 3
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
storeCell = cell(numel(uniqueInds),1)
storeCell = 3x1 cell array
{0x0 double} {0x0 double} {0x0 double}
%Solution with no loops:
tic
%Form vector of distinct values repetitions (acc to your custom logic):
vec = [3 2 2]; % 1D vector
storeCell = mat2cell(vectorContents,1,vec)
storeCell = 1x3 cell array
{[1 2 3]} {[4 5]} {[6 7]}
toc
Elapsed time is 0.085405 seconds.
%Ver of Stephen23 measurements
tic
C = accumarray(indexingVector(:),vectorContents(:),[],@(vectorContents){vectorContents.'})
C = 3x1 cell array
{[1 2 3]} {[ 4 5]} {[ 6 7]}
toc
Elapsed time is 0.053025 seconds.
tic
C = arrayfun(@(n)vectorContents(n==indexingVector),1:max(indexingVector),'Uni',0) % probably the slowest
C = 1x3 cell array
{[1 2 3]} {[4 5]} {[6 7]}
toc
Elapsed time is 0.162446 seconds.
tic
C = groupsummary(vectorContents(:),indexingVector(:),@(indexingVector){indexingVector.'})
C = 3x1 cell array
{[1 2 3]} {[ 4 5]} {[ 6 7]}
toc
Elapsed time is 0.156229 seconds.
%Solution with 1 loops:
tic
for ii = 1:numel(uniqueInds)
currInd = uniqueInds(ii);
currLogic = indexingVector == currInd;
storeCell{ii} = vectorContents(currLogic)
end
storeCell = 1x3 cell array
{[1 2 3]} {[4 5]} {[6 7]}
storeCell = 1x3 cell array
{[1 2 3]} {[4 5]} {[6 7]}
storeCell = 1x3 cell array
{[1 2 3]} {[4 5]} {[6 7]}
toc
Elapsed time is 0.059105 seconds.
%Constructed by P.Mazniker
%Constructed from needing help code by
%https://join.skype.com/invite/oXnJhbgys7oW
%https://independent.academia.edu/PMazniker
%+380990535261
%https://diag.net/u/u6r3ondjie0w0l8138bafm095b
%https://github.com/goodengineer
%https://orcid.org/0000-0001-8184-8166
%https://willwork781147312.wordpress.com/portfolio/cp/
%https://www.youtube.com/channel/UCC__7jMOAHak0MVkUFtmO-w
%https://nanohub.org/members/130066
%https://pangian.com/user/hiretoserve/
%https://substack.com/profile/191772642-paul-m

Categorías

Más información sobre Loops and Conditional Statements en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by