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

4 Ansichten (letzte 30 Tage)
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!

Akzeptierte Antwort

Stephen23
Stephen23 am 17 Okt. 2024
Bearbeitet: Stephen23 am 17 Okt. 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]}

Weitere Antworten (1)

Pavl M.
Pavl M. am 17 Okt. 2024
Bearbeitet: Pavl M. am 17 Okt. 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

Kategorien

Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by